如何处理Python中另一个模块的未初始化全局变量?
我遇到了一个问题,我想使用另一个模块里的一个函数,但这个函数又调用了一个调试函数,这个调试函数会检查一个全局变量是否有某个属性。问题是,当我导入这个函数的时候,这个全局变量并没有被设置(通常是通过 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'