DEFINE1 = 1
DEFINE2 = 2
DEFINE3 = 3
...
DEFINE10 = 10
假设一个文件有10个全局常量,我想导入另一个文件。
有没有更简单的方法来导入所有全局常量而不执行以下操作:而不是执行以下操作:from file_one.py import *。我不希望它导入整个文件,只需要导入全局变量。
from file_one.py import DEFINE1, DEFINE2, DEFINE3, ..............
答案 0 :(得分:4)
假设所有大写字母都是全局常量:
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 *
将它们导入到两个模块中。
答案 1 :(得分:4)
首先,我认为创建很多像你一样的常量并将它们全部放在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
我强烈反对这种hackery,但这样就可以自动导入你定义的常量而无需单独列出它们。
答案 2 :(得分:0)
你不能只拥有一个包含常量的文件,并调用:
from file_constants import *
...
答案 3 :(得分:0)
我建议有一个存储常量的对象。例如,像这样:
# 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
答案 4 :(得分: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
只需导入颜色或线型。这将为您的常量提供模块中的命名空间,以便您可以限制导入,并避免某些名称冲突。