我们都被告知使用from module import *
是一个坏主意。但是,有没有办法使用通配符导入module
内容的子集?
例如:
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
函数。但是假设我们DID希望所有MODULE_VAR*
变量都可以在本地访问。
简单地放from module import MODULE_VAR*
不起作用。有没有办法实现这个目标?
我使用了100个变量作为说明,因为如果添加更多变量(例如from module import MODULE_VAR1, MODULE_VAR2, MODULE_VAR3, ..., MODULE_VAR100
),那么执行MODULE_VAR101
显然会非常笨拙并且无法工作。
答案 0 :(得分:7)
你可以有一个辅助功能 - 它可以在没有魔法的情况下完成:
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()
可以避免帧内省魔法,这通常被认为是有害的。
答案 1 :(得分:4)
使用__all__
语法时,您可以使用import *
变量导入特定变量。
mymodule.py
__all__ = [
'MODULE_VAR1',
'MODULE_VAR2',
'MODULE_VAR3',
'MODULE_VAR4',
'MODULE_VAR5',
]
MODULE_VAR1 = "hello"
MODULE_VAR2 = "world"
MODULE_VAR3 = "The"
MODULE_VAR4 = "quick"
MODULE_VAR5 = "brown"
def abs():
print "Absolutely useful function: %s" % MODULE_VAR1
然后我们可以这样使用它:
from mymodule import *
print MODULE_VAR1 # hello
print abs # <built-in function abs>
当使用*
导入模块时,Python会检查模块中的__all__
变量,该变量可以覆盖模块中可能被视为正常“公共”变量的变量(这将是变量不要以下划线开头)并允许您明确定义哪些变量是“公共的”。 Check out this question