我有一个process_persons()Python函数,它访问全局字典,如下所示:
def process_persons():
for k, v in person_dict.items():
# do some processing
def main():
global person_dict
person_dict = {}
reader = csv.reader(open('person_file.csv', 'r'))
for row in reader:
key = (row[0], row[1])
person_dict[key] = row[2]
我写了一个这样的单元测试:
def test_process_persons(self):
process_persons()
# assert that the processing is done right!
但我得到了错误:名称错误:全局名称"person_dict"未定义。感谢您的帮助。
请注意,我不能更改我正在测试的方法的签名!
NameError: global name 'person_dict' is not defined
那是因为你没有定义它。它怎么知道它是什么?你说person_dict[key] = row[2]
,但这并不能自动使它成为词典。你必须用一个值来初始化它,例如
person_dict = {}
上面写着这是一本空字典。
也不需要global
声明。您将作为文件的顶层执行此操作(即不在函数或类内部),以便可以正常使用它。
我相信它实际上是未定义的。请尝试将global person_dict
替换为:
person_dict = {}
不太确定你想要实现什么,但考虑到被测函数的签名被冻结,我可能会这样做。
def process_persons():
for k, v in person_dict.items():
# do some processing
person_dict = {}
if __name__ == '__main__':
reader = csv.reader(open('person_file.csv', 'r'))
for row in reader:
key = (row[0], row[1])
person_dict[key] = row[2]
你需要在某个地方定义person_dict。声明它是全局的并不能定义它。当您想从函数中为模块级定义的变量赋值时,会使用global
。如果未指定global
,则会在函数中创建一个新的局部变量,该变量将覆盖全局变量。然后,当函数退出时,新创建的变量将超出范围,被垃圾收集,并被遗忘,没有任何用处。
既然您已经在模块级别上定义了person_dict,那么在调用process_persons
来更改输入数据之前,您可以简单地从测试代码中将其分配给它。