如何处理Python中另一个模块的未初始化全局变量?

0 投票
1 回答
543 浏览
提问于 2025-04-17 12:24

我遇到了一个问题,我想使用另一个模块里的一个函数,但这个函数又调用了一个调试函数,这个调试函数会检查一个全局变量是否有某个属性。问题是,当我导入这个函数的时候,这个全局变量并没有被设置(通常是通过 parser.parse_args 来设置的),所以函数就报错说这个属性不存在。为了更清楚,我来解释一下:

文件 findfile.py

_args = {}

def _debug(msg):
    if _TEST and _args.debug:
        print msg

def findfile(filename):
    ...
    _debug("found file")
    ...

if __name__ == "__main__":
    ...
    _args = parser.parse_args()
    ...

文件 copyafile.py

import findfile

findfile.findfile("file1")

这样做之后我得到了

AttributeError: 'dict' object has no attribute 'debug'

现在我明白 parser.parse_args() 返回的是一个命名空间(??),而 _args.debug 其实并不是在查找 dict。但我想问的是:在这种情况下,我该如何正确地给 _args 赋值,让 _args.debug 设置为 False

我不能修改 findfile.py,但我可以修改 copyafile.py

通常这些情况是怎么处理的呢?在脚本中启用调试标志的 pythonic 方法是什么?

1 个回答

1

findfile.py这个文件写得不对,不过你可以试着让它工作,方法是设置你的Argumentparser,像这样:

parser.add_argument('debug', action='store_true')

然后再用:

import findfile
findfile._args = parser.parse_args()

确保你的_args.debug默认设置为False

关于你的错误:

你遇到的错误是AttributeError: 'dict' object has no attribute 'debug',这是因为你在试图像访问一个Namespace那样访问一个dict

也许一个例子能帮助你理解什么是Namespace

>>> d = {'apple': 'red'}
>>> d['apple']
'red'
>>> from argparse import Namespace
>>> ns = Namespace(apple='red')
>>> ns.apple
'red'

撰写回答