为了账号安全,请及时绑定邮箱和手机立即绑定

定义类变量时出现NameError

定义类变量时出现NameError

青春有我 2021-08-14 13:38:41
显然我在做一些愚蠢的事情。但是什么?我得到:File "<path>", line 71, in args    filename = filenameNameError: 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然而上面的第二行(“打印(文件名)”)工作正常。那么,为什么会出错?如果您想知道为什么我首先要这样做,那是因为函数 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 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-08-14
?
莫回无

TA贡献1865条经验 获得超7个赞

在我看来,您有一个范围问题,因为内部类 '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 变量范围的更多信息。


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信