お世話になります。
Pythonでは、独自に定義した名前の呼び出し方を間違えた際、実行後にエラーが吐かれると思います。
実行開始後数分程度でエラーが出る分には構いませんが、場合によっては数時間後にエラーコードに行き当たるケースもあります。
実行前に全文エラー検知するような方法はありますか?
以上、よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
PythonやRubyのような動的言語では完全な事前検知は不可能だと思います。
例えば、下記のコードを見てください。
Python
1def f(): 2 print(abc.lower()) 3 4def g(x): 5 print('--- called with %s ---' % x) 6 try: 7 f() 8 except NameError: 9 print('NameError') 10 except AttributeError: 11 print('AttributeError') 12 13g(1) 14exec('a%s = "ABC"' % 'BC'.lower()) 15g(2) 16exec('%sc = 1' % 'AB'.lower()) 17g(3)
関数f()
はグローバル変数abc
が定義され、文字列(厳密にはlower()
をメソッドとして持つ)である場合のみうまくいきます。g(2)
は正常、g(1)
やg(3)
部分は異常、ということを事前に検知するにはどうしたらいいでしょうか?
グローバル変数abc
が定義されるのかどうかを検知するにはexec自体の所を評価しないといけません。これは実際に評価しないとわかりません。さらに、abc
が文字列であるかどうかなど、実際に評価されているときにどうなっているかです。これも実際に評価しないとわかりません。静的な構文だけでf(2)
のみ正しいと判断は不可能です。逆に言えば、f()
でabcd.pop('a')
と書いてしまったとき、f(2)
が失敗するかどうかを判断することも不可能です。もしかしたら、exec('a%sd = {"a": "ABC"}' % 'BC'.lower())
と書いてあるのかも知れませんので、評価しないと間違っているかは判断できません。
よって、静的言語並の事前検知は動的言語では不可能というのが結論だと思います。
で、終わってはなんですので、それでもどうするのかを語ります。
###全部テストせよ
全ての関数の想定される動作について、全てのテストを書き、テストを実施します。いわゆるユニットテストというものです。テスト方法やライブラリはなんでもいいですが、全てをテストする事が大切です。
一般的に、動的言語は大規模開発には向かないと言われていました。理由はまさしくこのコーディングミスによる事前検知ができないためです。しかし、実際の現場では大規模なプログラムは存在します。それらはどうしているかというと、とにかくもれなくテストして、事前検知の代わりにしているからです。全ての関数の全ての分岐について、一度はテストされるのであれば、単純なスペルミスは全て駆逐できます。
これはかなり大変ですが、大規模開発で安定性や信頼性が高いプログラムを作るときは言語に関係無く必須と言われています。C/C++を使おうが、Javaを使おうが、どっちにしても必要なため、Pythonだからといって不利というわけではありません。
###Lintしよう
PEP8に従って書いてますでしょうか? えっ、書いてない? いやいや、今すぐ書きましょうよ。
PythonにはPEP8のようなコーディング規約と、それをチェックするツールがあります。他にもいくつか規約があるようです(後述の参考文献を参照)。これらは完全なチェックまでとは言えませんが、おかしな書き方を指摘してくれます。たとえば、使われていないローカル変数があるという指摘は、かなりの確率でスペルミスをしている可能性が高いです。これらのツールを使えば、ある程度はおかしな所の事前検知が可能です。Pythonがさらに見やすくてわかりやすくなると言うこともあり、このようなツールを使うことを推奨します。
参考文献: Python の Lint (文法チェッカ) まとめ - flake8 + hacking を使う - - Qiita
###夢の静的型
まずは、下記のQiitaの記事を読んでください。
[翻訳] Python の静的型、すごい mypy! - Qiita
めっちゃわくわくしませんか? そう、問題の一つはPythonが「動的型付け」だからと言うことがあります。ダッグタイピングはある面でいいところもありますが、型チェックという面では、もうどしようもなく駄目です。ということで考えられているのが、タイプヒンティングです。既存のコードに一つ一つアノテーションを追加するのは面倒かと思いますが、その力は強力です。静的言語並みの事前チェックが可能になる(ような気がする)に違いありません。
タイプヒンティングは今後の動的言語での主流になっていくと思います。Perl6、PHPはすでに採用しています。JavaScriptはTypeScriptというaltJSを使えばできます。Rubyは次のメージャーバージョンである3あたりで入れたいなーってどっかの記事に載ってました。Pythonはmypyが実用的になった時点でもう敵無しです。ぜひ、お試しください。
※ タイプヒンティングは完璧ではありません。execやevalを使ったり、リフレクションを使って動的に構成を変えようとすると、無理が生じると思います。あくまで、静的にコーディングする場合のツールと思った方がいいでしょう。
投稿2016/10/29 06:15
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。