Python 3.5.2で奇妙な動作が発生しました。私はクラスFoo
を持っていて、一度だけコードを実行したいのですが、すべてのインスタンスに対して一度だけを実行します。このコードはclass
ステートメントのすぐ下に配置されています。このコードをruningて場合annotations
ディレクトリが空でない場合、次のエラーメッセージが表示されPython 3.5.2:ディレクトリが空でない場合は "名前が定義されていません"
import os
class Foo:
path = "annotations/"
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
def __init__(self, x):
# do something
1+1
(空のファイルで十分)
Traceback (most recent call last):
File "foo.py", line 3, in <module>
class Foo: File "foo.py", line 6, in Foo
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))] File "foo.py", line 6, in <listcomp>
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
NameError: name 'path' is not defined
annotations/
が空である場合は、エラーが発生しません。どうして?この奇妙な動作は、単一行forループを使用している場合にのみ発生します。
私はPython 3.5.2を使用しています。 Python 2.7.12で上記のコードを実行すると、エラーは表示されません。
MacOSのPython 3.5.2では再現できません。とにかく 'class'定義ではなく、関数内の' files'の値を計算することをお勧めします。あなたがするのは醜いです。 Pythonを更新/再インストールしてみてください。 – warvariuc
私はPython 3.5.2を使用します。 Ubuntu 16.04システムで動作します。これは私がクラスに静的なコードを追加する通常の方法のようです。なぜこれは醜いはずですか?誰も満足のいく解決策を提示しないなら、おそらく私はPythonを再インストールしようとします。 – null
リスト内包*のネストされたスコープでは、 'path'という名前は表示されないので、' NameError'を取得します。しかし、最も外側の 'for' iterableソースではなく' if'ステートメントでの使用のみ(list comprehensionの外で計算されるため)と 'if'ステートメントは、テストするイテレータに実際に要素がある場合にのみ使用されます。重複を参照してください。 –