定义类变量时出现NameError

时间:2018-11-10 20:00:37

标签: python

显然我在做一些愚蠢的事情。但是呢?

我得到:

File "<path>", line 71, in args
    filename = filename
NameError: name 'filename' is not defined

...在下面的倒数第二行(“文件名=文件名”):

def parseLog(filename, explain=False, omitminor=False, omitexpected=False, 
omitgdocs=False, args=None):
    print(filename)
    if not args:
        class args:
            filename = filename
            explain = explain

但是上面的第二行(“ print(文件名)”)工作正常。那么,为什么会出错?

如果您想知道为什么我要这样做,那是因为parseLog()函数也可以通过命令行调用,如下所示:

def parseLogCLI():
    ''' parse command line for arguments '''

    parser = argparse.ArgumentParser()
    parser.add_argument('filename')
    parser.add_argument('-explain', action="store_true", help='Explain what program has done')
    parser.add_argument('-omitminor', action="store_true", help='Omit minor errors ' + repr(minor_errors))
    parser.add_argument('-omitexpected', action="store_true", help='Omit machines expected to be often offline')
    parser.add_argument('-omitgdocs', action="store_true", help='Omit errors on Google Docs native files (not copyable) ' + repr(gdocs))
    args = parser.parse_args()

    parseLog(arg.filename, args=args)

...所以我正在尝试构造一个“ arg”类(就像argparse一样)以传递给我的函数。如果有更好的方法可以做到这一点,我很感兴趣。

2 个答案:

答案 0 :(得分:2)

使用class args:开始定义一个类。 在这种情况下,filename的第一次出现定义了一个类属性,您试图在其属性完全定义之前从其自己的值进行分配。

首先,我认为您应该更详细地研究类,范围和实例的概念。 这将帮助您了解为什么函数参数filename被类范围内的新定义隐藏了。

答案 1 :(得分:0)

在我看来,您好像遇到了范围问题,因为内部类'arg'无法访问外部类的范围。一种解决方案是像这样使用'global'关键字:

def parseLog(filename, explain=False, omitminor=False, omitexpected=False, 
omitgdocs=False, args=None):
    global fname, expl
    fname = filename
    expl = explain
    print(filename)
    if not args:
        class args:
            filename = fname
            explain = expl

您可以阅读有关Python变量作用域here的更多信息。