3

十分な大きさの python ファイルで作業しているときに、誤ってグローバル スコープで関数を再定義してしまいました。そのような場合、Python インタープリターが警告してくれるとありがたいです。

次のコード (バージョン 1) から始めるとします。

#!/usr/bin/env python

... lots of code ...    

def foo(version):
  if version == 1:
    return "Correct"
  return "Oops!"

... lots more code ...

print foo(1)

正しく動作するもの:

Correct

そして、いくつかの変更を加えて、それをバージョン 2 と呼びます。foo 関数を書き直しましたが、古い関数が存在していたことに気付かないか、削除するのを忘れています。あなたはこれで終わります:

#!/usr/bin/env python

def foo(version):
  if version == 2:
    return "Correct"
  return "Oops!"

... lots of code ...    

def foo(version):
  if version == 1:
    return "Correct"
  return "Oops!"

... lots more code ...

print foo(2)

これはうまく機能しません:

Oops!

私はPythonが次のようなコードを許可していることを知っています:

def monkey():
  return "patching"
monkey = "is"
def monkey():
  return {"really": "fun"}

しかし、そのように「def」を使用するのは悪い習慣のようです。

この種の動作を取得する方法はありますか:

#!/usr/bin/env python --def-strict
def foo():
  pass
def foo():
  pass

結果:

Traceback (most recent call last):
  File ..., line 3, in <module>
NameError: name 'foo' is already defined
4

2 に答える 2

2

関数の名前を比較して辞書に保存できるデコレータを作成できます。キーが既に存在する場合は、デコレータから例外をスローできます! 開発中にこのデコレーターですべての関数を装飾します。すべてのテストが完了したら、装飾を取り除くことができます。

何かのようなもの


#import sys

if sys.argv[1] == "--def-strict":
    def duplicateFinder(f):
        if globals().has_key(f.__name__):
            raise AttributeError, "This module already has a function %s defined" % f.__name__
        return f
else:
    def duplicateFinder(f):
        return f

@duplicateFinder
def myFunction():
    print "Hello World!"

@duplicateFinder
def myFunction():
    print "Hello World Again!!!"


これを「python --def-strict scriptname」で実行すると、エラーが発生するはずです。

編集:架空の --def-strict! を追加します。また、別の __functionNames 辞書を保持する必要はありません。globals() 辞書で十分です。同じように編集してください!

于 2013-06-23T17:41:12.207 に答える