Python 3.5.2:"名称未定义"如果目录不为空

时间:2016-11-11 11:35:03

标签: python python-3.5

我在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运行上述代码时,不会出现错误。

2 个答案:

答案 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]$