質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1524閲覧

Pythonでのデバッグ方法について

takhub

総合スコア28

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

4クリップ

投稿2016/10/29 01:42

お世話になります。
Pythonでは、独自に定義した名前の呼び出し方を間違えた際、実行後にエラーが吐かれると思います。
実行開始後数分程度でエラーが出る分には構いませんが、場合によっては数時間後にエラーコードに行き当たるケースもあります。
実行前に全文エラー検知するような方法はありますか?

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2016/10/29 04:01

本番供用前に、普通に全文網羅テストを実施すればいいと思いますが……そういう話ではないのかな。
takhub

2016/10/29 04:42

ありがとうございます。すみません、全文網羅テストとはどういうことでしょうか。
ikedas

2016/10/29 05:02

ウェブ検索してみてください。
guest

回答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

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問