如何在不列出每个变量的情况下导入大量全局变量? (蟒蛇)

时间:2011-08-03 15:03:08

标签: python import

DEFINE1 = 1
DEFINE2 = 2
DEFINE3 = 3
...
DEFINE10 = 10

假设一个文件有10个全局常量,我想导入另一个文件。

有没有更简单的方法来导入所有全局常量而不执行以下操作:而不是执行以下操作:from file_one.py import *。我不希望它导入整个文件,只需要导入全局变量。

from file_one.py import DEFINE1, DEFINE2, DEFINE3, ..............

5 个答案:

答案 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

只需导入颜色或线型。这将为您的常量提供模块中的命名空间,以便您可以限制导入,并避免某些名称冲突。