Python跨文件导入函数报错:global name 'efgh'未定义
解决函数导入后变量无法访问的NameError问题
这个问题的核心是Python的作用域规则:函数fun_a是在fun_a.py模块中定义的,它会优先查找自己所在模块的命名空间里的变量,而你在交互式环境中定义的efgh属于当前主模块(__main__)的命名空间,fun_a根本看不到它,所以抛出了NameError。
下面给你两种可行的解决方案,推荐第一种(更符合Python的编码规范):
方案1:将efgh作为参数传入函数(推荐)
这是最清晰、最易维护的方式,把函数需要的所有外部变量都显式作为参数传递:
修改fun_a.py的代码:
def fun_a(abcd, efgh): print '%s - %s'%(abcd, efgh) if __name__ == "__main__": pass
然后在交互式环境中调用:
>>> from fun_a import * >>> fun_a('test1', 'test2') test1 - test2
方案2:在fun_a模块的命名空间中定义efgh
如果你不想修改函数的参数列表,可以在导入模块后,给fun_a所在模块的efgh变量赋值:
>>> import fun_a # 注意这里要导入整个模块,而不是用from ... import * >>> fun_a.efgh = 'test2' >>> fun_a.fun_a('test1') test1 - test2
或者直接在fun_a.py里预先定义efgh的默认值:
efgh = 'default_value' # 预先定义模块级变量 def fun_a(abcd): print '%s - %s'%(abcd, efgh) if __name__ == "__main__": pass
之后在交互式环境中可以覆盖这个值:
>>> from fun_a import * >>> efgh = 'test2' >>> fun_a('test1') test1 - test2
不过这种方式会让函数依赖模块级变量,耦合性比较高,不推荐在复杂项目中使用。
内容的提问来源于stack exchange,提问作者Radek
相关产品推荐
相关产品推荐

