我有一个这样的程序class A(): def __init__(self): self.foo = xif __name__ == '__main__': x = 96 a=A() print(a.foo)当它从 shell “python foo.py” 运行时,它会打印出 96我也有 test_foo.pyimport fooimport unittestclass TestFoo(unittest.TestCase): def test1(self): x=37 a=foo.A() self.assertEqual(a.foo, 37)if __name__ == '__main__': unittest.main()当我从 shell 运行这个 test_foo.py 时,我得到$ python test_foo.py E======================================================================ERROR: test1 (__main__.TestFoo)----------------------------------------------------------------------Traceback (most recent call last): File "test_foo.py", line 8, in test1 a=foo.A() File "/home/zzz/foo.py", line 3, in __init__ self.foo = xNameError: global name 'x' is not defined----------------------------------------------------------------------Ran 1 test in 0.000sFAILED (errors=1)所以我的问题是,是否可以从 test_foo.py 测试 foo.py,设置 x 并看到它在类 A 中使用。 f 而不改变 foo.py 程序显然,这是一个真实程序的简化版本我用 python 3.6 和 2.7 得到相同的结果我曾尝试使用 的各种组合,global但没有找到使用它的方法
3 回答
湖上湖
TA贡献2003条经验 获得超2个赞
您可以x
在此处访问全局范围内的变量:
self.foo = x
当您直接运行脚本时__name__
是' main ',而不是设置全局变量x
而不是construct A()
。当您导入foo
模块代码时,if
不执行。x
全局作用域和任何外部作用域中都没有变量。
四季花海
TA贡献1811条经验 获得超5个赞
您的x变量是在if检查是否foo.py作为主程序运行的块内定义的,因此何时foo.py由test_foo.py,导入,x将不会被定义,因此会出现错误。
您应该x在if块外定义:
x = 96
class A():
def __init__(self):
self.foo = x
if __name__ == '__main__':
a=A()
print(a.foo)
而在test_foo.py,如果你想覆盖的价值x的foo,你应该做foo.x=37的,而不是x=37因为x否则将是一个局部变量test1。
慕的地10843
TA贡献1785条经验 获得超8个赞
您需要将其更改为:
class A():
def __init__(self,x):
self.foo = x
并在测试中:
class TestFoo(unittest.TestCase):
def test1(self):
x=37
a=foo.A(x)
self.assertEqual(a.foo, 37)
添加回答
举报
0/150
提交
取消