2016-05-20 57 views
-1

Q用のPython警告を探す:矛盾、同じ機能の複数の定義がある場合にはPythonが私に警告を与えるために取得する方法がある、など乗算定義関数

(私は無駄に同じ機能の2つの異なるバージョンに編集を行う時のビット)

競合関数定義の小さな例:

$> cat ./foo2.py 
cat ./foo2.py 
def foo(): 
    print "1st definition of foo()" 
def foo(): 
    print "2nd definition of foo()" 
foo() 

実行 - Pythonは、最後の定義を使用します。 (それは正式に定義されているのですか?それは便利なセマンティクスです。たとえば、文字列の関数を即座に作成して評価するときなどに便利ですが、インタプリタでは便利ですが、場合によってはバグをマスクして、 。

$> python -W all ./foo2.py 
python -W all ./foo2.py 
2nd definition of foo() 

どちらも "警告を使用して" ん:警告)

$> python ./foo2.py 
python ./foo2.py 
2nd definition of foo() 

"-Wすべてのpythonは" 警告を与えるものではありません。そのことについては

(のpython3が:-(印刷するには、引数の周りに括弧が必要ですが)、のpython3は上記と同じことを行います。

pylintはエラーに

E: 4, 0: function already defined line 2 (function-redefined) 

を報告んが、私が持っています(lintは騒々しい; lintはオプションであり、常に実行されるわけではなく; lintはオプションであり、例えばpythonに自動的にインストールされず、必須であるなど)。私はインストールするためにいくつかのハックを行うために(自家製の問題?) - 私はほとんど諦め、私があきらめていたなら私はしなかったpylintを持っていた)

そのため、pylintがエラーを見つけるんが、私はまだ聞いて:。

Qを:乗算定義関数のエラーまたは警告を報告するのpython自体を取得する方法はありますか?

比較すると===

、と言う人々に応じて、「なぜ、あなたは動的言語でそれをやりたいのでしょうか?」

Perlは動的言語です。 Perlが最初に出てきたとき、そのような警告はなかった。しかし、現在では、人々はそのような警告がコード品質には良いことを認識しています。

Perlはデフォルトで複数の定義について警告しませんが、-Wallで警告したり、警告を使用したりします。

$> cat foo2.pl 
cat foo2.pl 
sub foo { print "foo#1" } 
sub foo { print "foo#2" } 
foo() 

$> perl -Wall ./foo2.pl 
perl -Wall ./foo2.pl 
Subroutine foo redefined at ./foo2.pl line 2. 
foo 
+0

いいえ、存在しません。 Pythonは非常に動的な言語であり、名前を他のもの(関数など)に再割当てすることを止めるものはありません。 – jonrsharpe

+0

これは、より一般的な質問[http-python-have-a-use-strict-and-use-warnings-like-perl]のように、オプションで有効にしたいという警告の特定の例です(http ://stackoverflow.com/questions/13425715/does-python-have-a-use-strict-and-use-warnings-like-in-perl) –

+0

そしてその質問に対する答えは「no」*あなたは何を期待しましたか? – jonrsharpe

答えて

1

いいえ、Pythonにこのようにネイティブに動作させる方法はありません。関数定義は本質的に名前への代入であり、Pythonの名前はいつでも再割り当てできます。関数は、整数、文字列などと比べて特別な方法で扱われません。

+0

さて、Pythonはそのような警告を出すべきです(SHOULD)。 (宗教的な議論が続くと期待しています)...私は、Python3でおそらくこれを行う方法があると誰かが報告することを希望して数日を与えるでしょう...しかし、私はこの回答が承認された最終的には、Pythonは未熟な言語のように見えるので、コード品質のためのこのような機能が欠けています。 –

+0

パッチを提出してください。 – kindall

+0

十分に公正。プロダクションコードのために十分なPythonを使用していれば、そうすることができます。しかし、私は言語戦に疲れています。 –

1

関数をすべて飾り、シンボルのデータベースを作成して再定義を警告できます。

+0

私はPythonのイントロスペクションを使用していますが、AFAIKは関数の最後の定義のみを報告します。すべての定義を報告する方法はありますか?このようなチェックの目的はバグを見つけることであるため、すべての関数を飾ることは損失になります。飾る方法を知りたくない経験の浅いプログラマは、このようなバグの最も一般的な原因です。 (ただし決して唯一のものではありません) –

+1

モジュール内のすべてのメソッドをデコレートする関数を作成できます。その情報をパッケージ内の複数のモジュール間で共有するには、いくつかの余分な管理が必要です。たぶん、ユーザーが何かをインポートするだけで、重複を見つけるために関数を呼び出す必要があるので、簡単に行うことができます。 – totoro

0

言語には何も組み込まれていませんが、pylintのようなコードチェックツールを使用することができます(また、他のツールもあると思います)。これらの種類のものを見つけて警告します。

+0

私は私の質問に追加しました:...プログラミング言語の歴史に精通している人にはよく知られているはずの糸くず用ツールを分離することに対する通常の反対です。 (例:lintは雑音が多く、lintはオプションで、常に実行されるわけではありません。lintはオプションですが、インストールされていないこともあります)。 –