我在Python 3.5.2中遇到了一些奇怪的行为。我有一个类Foo
,并且只想为所有实例执行一段代码 。此代码直接放在class
语句下面。
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
运行此代码时,如果annotations
目录非空(空文件就足够了),则会显示以下错误消息
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运行上述代码时,不会出现错误。
答案 0 :(得分:0)
如果我理解,首先你没有“注释”路径,那么你就可以制作“注释”路径并且有效。如果是这样,它是有道理的,因为脚本尝试读取“注释”路径但路径不存在!
您可以这样做:
if os.path.exists('annotations/'):
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
或者强行制作路径:
if not os.path.exists('annotations/'):
os.mkdir('annotations/')
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
答案 1 :(得分:0)
如果您已定义路径,则无法获得NameError
- 您提到过的路径。
运行它可能会给你:
OSError:[Errno 2]没有这样的文件或目录:'annotations /'
如果没有名为annotations
的目录
要处理场景 - 如果不存在,则必须创建目录(如Hugo所提到的):
import os
class Foo:
path = "annotations/"
if not os.path.exists('annotations/'):
os.mkdir('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
if __name__ == "__main__":
obj = Foo(1)
print 'hello'
输出 - 工作得很好,也创建了注释目录本身:
[ahmed@localhost so_tmp]$ ls
[ahmed@localhost so_tmp]$ python ../path_issue.py
hello
[ahmed@localhost so_tmp]$ ls
annotations
[ahmed@localhost so_tmp]$