3

ある時点ですべての中級レベルの Python プログラマーの心にあったと確信している質問があります。つまり、これらの非常に永続的で同じようにイライラするものを修正/防止/回避/回避する方法NameErrorsです。私は実際のエラー (タイプミスなど) について話しているわけではありませんが、実際にはさらに下に定義されているのに、基本的にグローバル名が定義されていないと言う奇妙な問題です。なんらかの理由で、Python はこの分野で非常に困窮しているようです: すべての単一の変数は、それを参照するものよりも上に定義する必要があり、それを参照するものの上にのみ定義する必要があります (またはそう思われます)。

例えば:

condition = True

if condition == True:
    doStuff()

def doStuff():
    it_worked = True

Python から次のように表示されます。

Traceback (most recent call last):
  File "C:\Users\Owner\Desktop\Python projects\test7.py", line 4, in <module>
    doStuff()
NameError: name 'doStuff' is not defined

ただし、名前は定義されていましたが、Python が明らかに望んでいた場所ではありませんでした。doStuff()したがって、大したことではないような安っぽい小さな関数の場合。特定の順序に対するシステムの要件を満たす領域に関数をカット アンド ペーストするだけです。しかし、実際にそれを使って何かを設計しようとすると、コードの整理が事実上不可能になります (このバグに対応するために、大量のコードを「整理」しなければなりませんでした)。私が書いた他の言語でこの問題に遭遇したことはないので、Pythonに固有のようです...しかし、とにかくドキュメントでこれを調査しましたが、解決策は見つかりませんでした(または潜在的な考えられる解決策につながる)ので、ヒント、トリック、回避策、またはその他の提案をいただければ幸いです。

特定の組織構造を学習するのと同じくらい簡単かもしれません (バグを回避するためのある種の "Pythonic" および非常に戦略的なアプローチのような)、または単に多くのimportステートメントを使用して、特定の組織構造でそれらを整理するのが簡単になるかもしれません。システムが動作しないようにするための命令...

4

5 に答える 5

5

トップレベルでのコード (宣言以外) の記述を避け、main()直接実行することを意図したファイルで関数を使用します。

def main():
    condition = True
    if condition:
        do_stuff()

def do_stuff():
    it_worked = True

if __name__ == '__main__':
    main()

このように、if..main構成が関数の後に続くことを確認するだけでよくmain()(たとえば、ファイルの最後に配置するなど)、残りは任意の順序でかまいません。が実行されるまでに、ファイルは完全に解析されます (したがって、モジュールで定義されたすべての名前を解決できます) main()

于 2013-05-27T10:48:18.240 に答える
2

In Python defining a function is an act which happens at runtime, not at compile time. During that act, the code compiled at compile time is assigned to the name of the function. This name then is a variable in the current scope. It can be overwritten later as any other variable can:

def f():
  print 42

f()  # will print 42

def f():
  print 23

f()  # will print 23

You can even assign functions like other values to variables:

def f():
  print 42
g = 23
f()  # will print 42
g    # will print 23
f, g = g, f
f    # will print 23
g()  # will print 42

When you say that you didn't come across this in other languages, it's because the other languages you are referring to aren't interpreted as a script. Try similar things in bash for instance and you will find that things can be as in Python in other languages as well.

于 2013-05-27T11:23:01.857 に答える
2

経験則として: ほとんどの場合、最初にすべての関数を定義してから、後でコードで使用します。

于 2013-05-27T10:41:40.853 に答える
1

これについては、次のように言えます。

  • コードが複雑すぎて 1 つのファイルにまとめられない場合は、多数のファイルを使用することを検討し、それらを 1 つの小さなメイン ファイルにインポートします。
  • あなたの関数をクラスに入れれば、それは機能します。例:

    class test():
        def __init__(self):
            self.do_something()
        def do_something(self):
            print 'test'
    
  • インタプリタ言語の特徴である Volatility からのコメントで述べたように

于 2013-05-27T10:45:10.837 に答える