2015/05/02

[py]ハードタブは1~8スペース扱い

pythonがインデント単位で処理する(C系の閉じる記号がない)というのは、なんとなく知っていた。
nfcpyとか見て、なんとなくわかった気になっていた。

で、今回BlueZのgatttoolを動かすpythonスクリプトを見ると、スペースのインデントとハードタブのインデントが混ざっていた。
これ、ありなの??

ありだった・・・。
検索するとすぐに出てきて、ハードタブは8スペース扱い、とのこと。
でも、言語仕様としてはわかったんだけど、いっそのことハードタブを禁止するとかの方がよかったんじゃないだろうか。
コーディングスタイルは人それぞれだから好みがあると思うけど、ハードタブの設定はテキストエディタで可変になるんで、ちょっと危険なような。
COBOLだかFORTRANだか忘れたけど、何桁目に書くとなんとか、みたいなタイプは、スペースだけの方がよいと思う。

まあ、こういうのは現場でやってる人からすると「わかってるから現場で回避するんだよ」という類のものだろう。
知っていれば回避できるし、個人で気に入らないコーディングをしなければ済むし、いざとなればastyleで見るときは書き換えてしまうとかもありだろう(astyleにpythonがあるか知らんが)。


2.1.8 インデント

まず、タブは (左から右の方向に) 1 つから 8 つのスペースで置き換えられ、置き換え後の文字列の終わりの位置までの文字数が 8 の倍数になるように調整されます (Unixで使われている規則と同じになるよう意図されています)。

  • タブは、コンパイラというか実行時というかのときにスペースに変換される。
  • そのスペースの数は、1~8。
  • 終わりが8の倍数になるように調整

ということだ。
だから、

  • スペース6個+タブ1個=スペース8個
  • スペース7個+タブ1個=スペース8個
  • スペース8個+タブ1個=スペース16個
  • スペース9個+タブ1個=スペース16個

となるはずだし、

  • タブ1個+スペース5個=スペース13個
  • タブ1個+スペース6個=スペース14個

となるだろう。

タブの前にスペースがなければ、あるいはちょうど8の倍数であれば8スペース扱い。
タブの前にスペースがあれば、それを含めて8の倍数になるよう調整。
式にするとめんどくさそうだ。

まあ、検索するとだいたい「混ぜるな危険」になってる。
私も混ぜないように気をつけよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。