Python导入函数作用域疑问及外部类导入后time未定义问题排查
Python导入作用域与代码拆分后的报错问题解答
1. 导入函数的作用域
在Python中,导入的模块、函数或对象的作用域遵循以下规则:
- 导入操作会将对象绑定到当前代码所在的命名空间:在全局代码块(函数/类外部)导入,就属于全局命名空间;在函数内部导入,就属于该函数的局部命名空间。
- 每个Python模块(.py文件)拥有独立的命名空间,模块之间的导入不会自动共享。比如A文件导入的模块,不会自动出现在B文件的命名空间里,哪怕B文件从A导入了类或函数。
2. 代码拆分后time未定义的问题分析与解决
问题原因
原代码中,time在主文件全局导入,类abc的func1能访问主文件的全局命名空间。但将类移到test1.py后,test1.py作为独立模块,有自己的命名空间,主文件导入的time不会进入test1.py的命名空间,func1调用time.sleep时,会在test1.py的命名空间中查找time,找不到就触发NameError。
你可能遗漏的点
如果已经在test1.py顶部添加了import time但问题仍存在,大概率是以下情况:
- 没有保存修改后的
test1.py,运行的还是未添加导入的旧版本文件; - Python解释器缓存了旧版本的
test1.py,可以重启解释器或删除__pycache__文件夹; - 导入语句写错,比如用了
from time import sleep却仍调用time.sleep,或者导入位置不对(比如放在了类内部而非全局作用域)。
正确解决方案
必须让test1.py自己导入所需的依赖,保证模块自给自足:
# test1.py 正确代码 import time class abc: def func1(self): while True: # 这里写你的业务逻辑 time.sleep(5)
完成修改后,保存文件,重启解释器运行主文件即可解决报错。
内容的提问来源于stack exchange,提问作者Steve Woodmore
相关产品推荐
相关产品推荐

