DEFINE1 = 1
DEFINE2 = 2
DEFINE3 = 3
...
DEFINE10 = 10
假设有一个文件包含了10个全局常量,我想要将它们导入到另一个文件中。
除了像下面这样一一导入之外,是否有更简单的方法来导入所有的全局常量呢?我不想导入整个文件,只想导入全局变量。
from file_one.py import DEFINE1, DEFINE2, DEFINE3, ..............
import file_one
g = globals()
for key in dir(file_one):
if key.isupper():
g[key] = getattr(file_one, key)
或者更简短:
import file_one
globals().update((key, getattr(file_one, key)) for key in dir(file_one)
if key.isupper())
话虽如此:不要这样做。显式优于隐式。您应该将这些常量放在一个单独的模块中,并使用 from constants import *
在两个模块中导入它们。
constants.py
的文件中,然后执行from constants import *
是完全可以的 - 我自己经常这样做。只要所有的常量都在该文件中定义,当我需要弄清楚SOME_CONSTANT
来自哪里时,我就知道去哪里找了。import re, file_one
for name,val in file_one.__dict__.items():
if re.match("[A-Z0-9_]+", name):
globals()[name] = val
你不能只有一个包含常量的文件,然后调用它吗:
from file_constants import *
..?
# file_one.py
class _COLORS:
BLUE = 0
RED = 1
GREEN = 2
COLORS = _COLORS()
然后你可以像这样引用它:
# file_two.py
from file_one import COLORS
print COLORS.BLUE #prints 0
class _Constants(object): pass
constants = _Constants()
constants.DEFINE1 = 1
constants.DEFINE2 = 2
...
然后要导入它们,执行以下操作(从导入中省略'.py'):
from file_one import constants
这也允许您将常量分组为有意义的子集:
colors = _Constants()
colors.RED = (255,0,0)
colors.GREEN = (0,255,0)
colors.BLACK = (0,0,0)
colors.WHITE = (255,255,255)
linetypes = _Constants()
linetypes.SOLID = 0
linetypes.DOTTED = 1
linetypes.DASHED = 2
只需导入颜色或线型即可。这将为您的常量在模块内提供一定的命名空间,以便您可以限制导入并避免一些名称冲突。