Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定义类变量时发生NameError_Python - Fatal编程技术网

Python 定义类变量时发生NameError

Python 定义类变量时发生NameError,python,Python,显然我在做一些愚蠢的事。但是什么呢 我得到: File "<path>", line 71, in args filename = filename NameError: name 'filename' is not defined 然而,上面的第二行(“打印(文件名)”)工作正常。那么,为什么会出现错误呢 如果您想知道我为什么要这么做,那是因为命令行也可以调用函数parseLog(),如下所示: def parseLogCLI(): ''' parse comma

显然我在做一些愚蠢的事。但是什么呢

我得到:

File "<path>", line 71, in args
    filename = filename
NameError: name 'filename' is not defined
然而,上面的第二行(“打印(文件名)”)工作正常。那么,为什么会出现错误呢

如果您想知道我为什么要这么做,那是因为命令行也可以调用函数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那样)来传递给我的函数。如果有更好的方法,我很感兴趣。

使用
类参数:
开始定义类。 在该上下文中,第一次出现的
filename
定义了一个类属性,在完全定义它之前,您正试图从它自己的值分配该类属性

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

在我看来,您似乎有一个作用域问题,因为内部类“arg”无法访问外部类的作用域。一种解决方案是使用“全局”关键字,如下所示:

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变量作用域的更多信息。

我发现这是可行的,但我不知道为什么:class args:pass;args.filename=filename他们可以为函数参数或类属性使用不同的名称来修复此问题。然而,我宁愿找到一种重构代码的方法,这样您就不需要在运行时创建类。在python中可以做到这一点,并且存在有效的用例。但99%的情况下,这只会增加复杂性,而没有显著的好处
global
无法解决此问题,但重新分配给其他名称是有效的。@HåkenLid
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