Python 3:如何无需模块前缀直接调用其他文件中的变量?
解决直接调用模块变量的问题
当然有办法帮你省去每次写resources.的麻烦!下面是几种实用的方案,你可以根据项目情况选择:
方案1:批量导入所有变量
最直接的方式就是用from resources import *,这样就能直接使用模块里的所有变量了:
from resources import * example = image1 another_example = sound_effect
⚠️ 注意:这种方式虽然省事,但有两个小问题:
- 如果你的主文件里有和资源同名的变量,会直接覆盖,容易引发bug;
- 代码可读性会降低,其他开发者看到
image1时,需要额外找它的来源。
方案2:导入特定需要的变量
如果不想导入全部变量,只挑自己需要的导入,既清晰又能避免冲突:
from resources import image1, image2, background_music example = image1
这种方式的好处是一目了然,别人一看就知道你用到了哪些资源,也不用担心命名冲突,适合资源数量不多的场景。
方案3:动态导入所有公开资源
如果你的resources.py里有大量资源,手动一个个导入太麻烦,可以用代码动态把模块的公开属性注入到当前命名空间:
import resources # 遍历模块的所有属性,只导入非私有(以下划线开头)的变量 for attr in dir(resources): if not attr.startswith('_'): globals()[attr] = getattr(resources, attr) example = image1
这个方法能一次性导入所有公开资源,但要注意过滤下划线开头的私有属性,避免导入模块内置的特殊方法或变量。另外同样要留意命名冲突的问题。
额外提醒
如果resources.py里的资源是运行时动态生成的(比如通过函数加载后才创建的变量),dir(resources)可能无法获取到这些变量,这时候你需要明确指定要导入的变量名,或者在resources.py里把这些动态生成的变量添加到__all__列表中,这样from resources import *就能正确导入它们了:
# 在resources.py里添加 __all__ = ['image1', 'image2', 'dynamic_resource']
内容的提问来源于stack exchange,提问作者GabrielT
相关产品推荐
相关产品推荐

