2012/09/07(金) [n年前の日記]
#1 [python] Pythonスクリプトの記述をチェックするツールを色々インストール
Python 界隈には、
_PEP 8
なる、「このように書くべし」という文書があるらしく。一応ソレに従って書いたほうがいいのかなと思えてきたので、関連ツールを探したり。
◎ Pylintをインストール :
Pylint は、Python スクリプトが規則通りに書かれているかチェックしてくれるツール、らしい。
とりあえず、Windows7 x64 + Python 2.7.3 上にインストールしてみたり。以下の記事を参考に作業。
_メモ: PyLintインストール - 路傍のプログラマ
_構文チェッカーの導入 - nelnal@python - pythonグループ
以下の3つのファイルをDL。
Windows の環境変数pathに、Pythonインストールフォルダ\Scripts も追加した。これで、以下のように打てば実行できるはず。
PyScripter でも使えるように設定してみた。ツール → ツールの設定、を選んで、Py&Lint を選択して、修正ボタンを押す。パラメータに、以下のような指定がされていた。
しかし、この Pylint、バカスカと警告が表示される。
エラーメッセージで検索してみたら、以下のやり取りに遭遇。
_python - How do I tell PyLint "it's a variable, not a constant" to stop message C0103? - Stack Overflow
_python code convention using pylint - Stack Overflow
「その警告を無視したいなら、スクリプトの頭のほうに呪文を書け」と言われてるのだろうか。
_Pylint Tutorial (Logilab.org) を眺めていたら、「この命名規則は Logilab の中の人の規則」「お前は、お前の命名規則を決めろ」「俺はPEP8標準に従いたいから、こんな規則は糞食らえだ。別の正規表現を指定する」と書いてあるようにも見える。であれば、気にしなくてもいいのかな。
とりあえず、Windows7 x64 + Python 2.7.3 上にインストールしてみたり。以下の記事を参考に作業。
_メモ: PyLintインストール - 路傍のプログラマ
_構文チェッカーの導入 - nelnal@python - pythonグループ
以下の3つのファイルをDL。
- pylint-0.25.2.tar.gz
- logilab-common-0.58.2.tar.gz
- logilab-astng-0.24.0.tar.gz
python setup.py installなんだか Syntax Error が大量に出ている気もするけど…。Pythonインストールフォルダ\Scripts\ 以下に、pylint.bat というファイルがあるから、たぶんインストールできているのだろう…。
Windows の環境変数pathに、Pythonインストールフォルダ\Scripts も追加した。これで、以下のように打てば実行できるはず。
pylint.bat hoge.py
PyScripter でも使えるように設定してみた。ツール → ツールの設定、を選んで、Py&Lint を選択して、修正ボタンを押す。パラメータに、以下のような指定がされていた。
$[PythonDir-Short]Lib\site-packages\pylint\lint.py $[ActiveDoc-Short] -f parseable自分の環境に合わせた記述に修正。自分の場合、以下のようになった。
$[PythonDir-Short]Lib\site-packages\pylint-0.25.2-py2.7.egg\pylint\lint.py $[ActiveDoc] -f parseable
- lint.py の場所が違ってたので修正。
- $[ActiveDoc-Short] のままだと長いファイル名を使った際に怒られるみたいなので、$[ActiveDoc] にしてみたり。
しかし、この Pylint、バカスカと警告が表示される。
[C, main] Invalid name ""x"" (should match [a-z_][a-z0-9_]{2,30}$)" hoge.py 97命名規則から外れてると言われてるのかな? 変数名等を3文字以上にすれば出なくなるみたいだけど。
エラーメッセージで検索してみたら、以下のやり取りに遭遇。
_python - How do I tell PyLint "it's a variable, not a constant" to stop message C0103? - Stack Overflow
_python code convention using pylint - Stack Overflow
「その警告を無視したいなら、スクリプトの頭のほうに呪文を書け」と言われてるのだろうか。
# pylint: disable-msg=C0103あるいは、pylint を動かす際に、このオプションをつけろと。
python lint.py --disable-msg=C0103 ...ただ、 _Pylint User Manual (Logilab.org) を眺める限り、
python lint.py --disable=C0103 ...じゃないといかんようにも見える。
_Pylint Tutorial (Logilab.org) を眺めていたら、「この命名規則は Logilab の中の人の規則」「お前は、お前の命名規則を決めろ」「俺はPEP8標準に従いたいから、こんな規則は糞食らえだ。別の正規表現を指定する」と書いてあるようにも見える。であれば、気にしなくてもいいのかな。
◎ pep8もインストール。 :
_pep8
というツールでも、規則通りに書かれているかチェックできるらしい。以下の記事で使い方が紹介されてた。
_Pythonのコーディングスタイル(PEP8)をコマンドでチェック | TRIVIAL TECHNOLOGIES @ats のイクメン日記
試しにインストールしようとしたが、pip なるツールを使わないといかんらしい。
_Python のパッケージを pip でインストール | すぐに忘れる脳みそのためのメモ に、Windows でも pip をインストールできそう、みたいなことが書いてあった。 _setuptools 0.6c11 をインストールしてから、以下を打つらしい。
ようやく、pep8をインストール。
せっかくだから、PyScripter から pep8 を呼び出せるようにしてみたり。ツール → ツールの設定 → 追加ボタンを押して設定する。
おそらく、メッセージフォーマ(ット?)の欄で、ツールの出力結果にはどういう情報が並んでいるか教えてやることができるのだろうと思う。pep8の場合、「ファイル名:行番号:列:内容」となってるので、それを教えてやる、みたいな。
_Pythonのコーディングスタイル(PEP8)をコマンドでチェック | TRIVIAL TECHNOLOGIES @ats のイクメン日記
試しにインストールしようとしたが、pip なるツールを使わないといかんらしい。
_Python のパッケージを pip でインストール | すぐに忘れる脳みそのためのメモ に、Windows でも pip をインストールできそう、みたいなことが書いてあった。 _setuptools 0.6c11 をインストールしてから、以下を打つらしい。
easy_install pippip がインストールできたっぽい。
ようやく、pep8をインストール。
pip install pep8Pythonインストールフォルダ\Scripts\ 以下に、pep8.exe が入ってくれた模様。
せっかくだから、PyScripter から pep8 を呼び出せるようにしてみたり。ツール → ツールの設定 → 追加ボタンを押して設定する。
- 名前 → pep8
- アプリケーション → $[PythonDir]Scripts\pep8.exe
- パラメータ → $[ActiveDoc]
- 作業ディレクトリ → $[ActiveDoc-Dir]
- メッセージフォーマ → $[FileName]:$[LineNumber]:$[ColumnNumber]:
- 出力をキャプチャ、メッセージをパース、トレースパックをパース、にチェックを入れる。
- コンテキスト → アクティブなPythonフ
- (お好みで)ショートカットキー → Ctrl+Shift+L
- Windows7 上では、どうもフォント幅があり過ぎて、設定ダイアログ中のところどころで文字列が切れてる・隠れてるのが微妙に辛い。
- アプリケーションやパラメータの入力欄では、Shift+Ctrl+P や Shift+Ctrl+M を押すと、指定に使えるアレコレがポップアップ表示されるので楽。
おそらく、メッセージフォーマ(ット?)の欄で、ツールの出力結果にはどういう情報が並んでいるか教えてやることができるのだろうと思う。pep8の場合、「ファイル名:行番号:列:内容」となってるので、それを教えてやる、みたいな。
◎ autopep8というツールもあるらしい。 :
いくら修正しても、pep8が「インデントが珍妙ナリ」と文句を言ってくる。E127,E128のあたりが出てくるというか。本来どう書くべきなんだろう?
検索しているうちに、 _hhatto/autopep8 というツールがあることを知る。pep8 1.3 以上が必要らしい。
試しにインストール。
もしかして、perltidy のように、渡したテキストを整形して返してくれるなら、xyzzy 上でも C-x # autopep8 と打つだけで、開いている PythonソースをPEP8に従った形で整形してくれるのでは? と思ったけれど試してみたらソースが消えて autopep8 のヘルプに書き換わってしまった。perltidy とは入出力の仕様が違うらしい…。
検索しているうちに、 _hhatto/autopep8 というツールがあることを知る。pep8 1.3 以上が必要らしい。
試しにインストール。
pip install autopep8実行。
autopep8 hoge.py > hoge_edit.pyWinMerge で空白の差異を見るようにして比較してみたが、たしかにインデントの仕方が違う。素晴らしい。
parser.add_option("-i", "--infile", metavar="WILDCARD", help=u"入力PNGファイル名(ワイルドカード指定) [default: %default]") ↓ parser.add_option("-i", "--infile", metavar="WILDCARD", help=u"入力PNGファイル名(ワイルドカード指定) [default: %default]")こう書かないといかんのか…。
もしかして、perltidy のように、渡したテキストを整形して返してくれるなら、xyzzy 上でも C-x # autopep8 と打つだけで、開いている PythonソースをPEP8に従った形で整形してくれるのでは? と思ったけれど試してみたらソースが消えて autopep8 のヘルプに書き換わってしまった。perltidy とは入出力の仕様が違うらしい…。
◎ PythonTidyというツールもあった。 :
_PythonTidy - 紫藤のWiki
_PythonTidy 1.22 : Python Package Index
PEP8に従って整形するよ、と書いてあるように見える。
PythonTidy-1.22.python をDLして pythontidy.py にリネーム後、xyzzy 上で C-x # pythontidy.py と打ってみたり。おお…整形してくれた!
しかし、docstring 内の日本語文字列が全部16進数表記になってしまった。たしかに PEP8 は「全部ASCII文字で書け。ソレ以外の文字を書きたかったら16進数で表記しろ」みたいなことが書いてあるのだけど。そこまでやられちゃうと困る…。全てのコメントを英語で書けば、英語圏の人間にはコメントが読めるようになるかもしれないけれど。スクリプトを書いた自分がコメントを読めなくなる。それはそれで何かおかしい。
色々試していたら、そもそも自分のdocstringの書き方がおかしかったことに気付いた。全部 u""" 〜 """ みたいに書いていたが、""" 〜 """ と書いておけば変換されずに済む。utf8n で書いてあるソースだと最初のあたりに明記してあるのだから、u""" 〜 """ と書かなくてもいい、のかな。たぶん。u""" 〜 """ と書いておくと、「これはUnicodeです」と伝えているので、わざわざ変換しちゃうのだろうと。
それはともかく。変換後のソースを見ると、docstring が ''' 〜 ''' になっている。それって、docstring じゃなくて、複数行文字列の記述なのでは? 少なくとも PyScripter 上では、docstring じゃなくて複数行文字列として扱われてしまうのだけど。
_PythonTidy 1.22 : Python Package Index
PEP8に従って整形するよ、と書いてあるように見える。
PythonTidy-1.22.python をDLして pythontidy.py にリネーム後、xyzzy 上で C-x # pythontidy.py と打ってみたり。おお…整形してくれた!
しかし、docstring 内の日本語文字列が全部16進数表記になってしまった。たしかに PEP8 は「全部ASCII文字で書け。ソレ以外の文字を書きたかったら16進数で表記しろ」みたいなことが書いてあるのだけど。そこまでやられちゃうと困る…。全てのコメントを英語で書けば、英語圏の人間にはコメントが読めるようになるかもしれないけれど。スクリプトを書いた自分がコメントを読めなくなる。それはそれで何かおかしい。
色々試していたら、そもそも自分のdocstringの書き方がおかしかったことに気付いた。全部 u""" 〜 """ みたいに書いていたが、""" 〜 """ と書いておけば変換されずに済む。utf8n で書いてあるソースだと最初のあたりに明記してあるのだから、u""" 〜 """ と書かなくてもいい、のかな。たぶん。u""" 〜 """ と書いておくと、「これはUnicodeです」と伝えているので、わざわざ変換しちゃうのだろうと。
それはともかく。変換後のソースを見ると、docstring が ''' 〜 ''' になっている。それって、docstring じゃなくて、複数行文字列の記述なのでは? 少なくとも PyScripter 上では、docstring じゃなくて複数行文字列として扱われてしまうのだけど。
[ ツッコむ ]
以上です。