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åkenLidglobal
如果指定新变量名,则有效,但如果将值重新分配给其他变量,则不需要使用它,这是正确的。
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