0

コードは次のとおりです。

#a.py
ALL_FUNC = [bar, foo]  #a list containing all the functions defined in this module

def bar():
    pass

def foo():
    pass

次に、次のように実行します: $ python a.py NameError: name 'bar' is not defined

エラー手段は、実行bar時に定義されていませんALL_FUNC = [bar, foo]。しかし、インタプリタがモジュール内の関数を見つけられないのはなぜbarでしょうか? barの後に定義されているという理由だけでALL_FUNC?

これを見てください、これはpythonクラスです、

class A:
    def __init__(self):
        self.bar()

    def bar(self):
        pass

a = A()

どうやら、上記のコードはエラーなしで実行されるようですが、アクセスされた場所 (in ) の後にbarinAも定義されているのに__init__、なぜself.bar()エラーなしで見つかるのでしょうか?

ファローアップ

ここに別のモジュールがあります。

#b.py
def bar():
    print k  #well, apparently this line will result in an error
def foo():
    pass

if __name__ == '__main__':
    foo()

次に、このように実行します。

$ python b.py

エラーなし!なんで?barエラーになるはずですよね?で使用されていない__main__ため、エラーが検出されないだけですか?でもbarの定義は実行されますよね?

4

2 に答える 2

2

インタープリターはスクリプトを上から下に実行します。

def実行文です。によって作成された名前def(最初の例のfooandなど) は、関連するステートメントが実行されるbarまで存在しません。def

2 番目の例:が呼び出さself.bar()れたときに名前が解決され、クラス定義全体が表示された後に呼び出されます。__init__()

于 2012-02-20T13:19:59.630 に答える
2

しかし、インタプリタがモジュール内の関数バーを見つけられないのはなぜでしょうか? bar が ALL_FUNC の後に定義されているという理由だけで?

コードはファイルに表示される順序で実行されるためです。ALL_FUNC関数定義に値を割り当てようとした場所は実行されていません。

__init__しかし、A の bar は、アクセスされた場所 ( 内)の後にも定義されています。なぜself.bar()、エラーなしで見つかるのでしょうか?

__init__クラスが定義された後に呼び出されたためです。クラスはa = A()、クラス定義の後に によってインスタンス化されます。


フォローアップへの対応

なんで?barエラーになるはずですよね?で使用されていない__main__ため、エラーが検出されないだけですか?でもbarの定義は実行されますよね?

あなたが電話した場合、あなたbar()NameError. 関数を定義したときbar、関数コードは実行ではなく解釈されました。これが s 以外のものを拾うかどうかはわかりませんが、間違いなくs ではありません。SyntaxErrorNameError

ただし、bar常にエラーになるとは限りません。検討:

>>> def bar():
...   print(k)
...
>>> bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in bar
NameError: global name 'k' is not defined
>>> k = "Foo"
>>> bar()
Foo
于 2012-02-20T13:24:10.657 に答える