我有一个函数,我正在从模块调用。在函数内,我试图访问的两个变量是全局的。当我在IDLE中运行模块时,我仍然可以按照预期在函数结束后访问变量。当我在我导入模块的代码中调用函数时,我无法访问变量。
#module to be imported
def globaltest():
global name
global age
name = str(raw_input("What is your name? "))
age = int(raw_input("What is your age? "))
我自己运行时的输出。
>>> globaltest()
What is your name? tom
What is your age? 16
>>> name
'tom'
>>> age
16
导入它的代码。
import name_age
name_age.globaltest()
但是当我试图访问我导入它的代码中的变量时。
What is your name? tom
What is your age? 16
>>> name
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
name
NameError: name 'name' is not defined
>>>
如何在导入模块的代码中创建变量global,或者访问函数中的'name'或'age'变量。
答案 0 :(得分:4)
简单的答案是“不要”。 Python的“全局”只是模块级的全局变量,甚至模块级的全局变量(可变的模块级全局变量)应该尽可能避免,并且使用它的理由非常少。
正确的解决方案是学会正确使用函数参数和返回值。在你的情况下,第一种方法是
#module.py
def noglobaltest():
name = str(raw_input("What is your name? "))
age = int(raw_input("What is your age? "))
return name, age
然后:
from module import noglobaltest
name, age = noglobaltest()
print "name :", name, "age :", age
答案 1 :(得分:1)
只需将您的import
语句更改为此语句:
from name_age import *
示例:强>
In [1]: from name_age import *
In [2]: print name
Out[2]: 'tom'
否则,如果要使用import name_age
语句,则必须通过模块名称引用访问global
变量,即:
示例:强>
In [1]: import name_age
In [2]: print name_age.name
Out[2]: 'tom'
答案 2 :(得分:0)
令我惊讶的是,现在还没有人提到这一妥协。正如其他人所述,由于PEP-8会阻止通配符导入,因此您也可以使用import ... as
来使代码更清晰。当其他人编写了一些我需要进行单元测试的(设计欠佳)代码时,我发现自己陷入了困境。
如果模块foo.bar
包含一个名为VARIABLE
的全局变量,那么下面是在我的单元测试中如何从其模块访问全局变量的示例:
import unittest
import foo.bar as fb
class testFooBar(unittest.TestCase):
def test_VAR(self):
self.assertEqual(fb.VARIABLE, 1234, “foo.bar.VARIABLE should be 1234”)