我们都被告知使用 from module import *
是个坏主意。但是,有没有办法导入 module
内容的子集?使用通配符?
例如:
模块.py:
MODULE_VAR1 = "hello"
MODULE_VAR2 = "world"
MODULE_VAR3 = "The"
MODULE_VAR4 = "quick"
MODULE_VAR5 = "brown"
...
MODULE_VAR10 = "lazy"
MODULE_VAR11 = "dog!"
MODULE_VAR12 = "Now"
MODULE_VAR13 = "is"
...
MODULE_VAR98 = "Thats"
MODULE_VAR99 = "all"
MODULE_VAR100 = "folks!"
def abs():
print "Absolutely useful function: %s" % MODULE_VAR1
显然我们不想使用 from module import *
因为我们会覆盖 abs
功能。但是假设我们确实想要所有 MODULE_VAR*
可在本地访问的变量。
简单地说from module import MODULE_VAR*
不起作用。有没有办法做到这一点?
我用了 100 个变量作为例子,因为做 from module import MODULE_VAR1, MODULE_VAR2, MODULE_VAR3, ..., MODULE_VAR100
如果添加更多变量(例如 MODULE_VAR101
),显然会非常笨重并且无法工作。
最佳答案
你可以为此使用一个辅助函数 - 无需魔法即可完成:
import re
def matching_import(pattern, module, globals):
for key, value in module.__dict__.items():
if re.findall(pattern, key):
globals[key] = value
现在,你可以这样做:
from utils import matching_import
import constants
matching_import("MODULE_VAR.*", constants, globals())
以这种方式显式使用 globals()
可以避免通常被认为是有害的帧内省(introspection)魔法。
关于Python:通配符子集导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226390/