如何在Python中导入大量全局变量而不需要列出每个变量?

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

假设有一个文件包含了10个全局常量,我想要将它们导入到另一个文件中。

除了像下面这样一一导入之外,是否有更简单的方法来导入所有的全局常量呢?我不想导入整个文件,只想导入全局变量。

from file_one.py import DEFINE1, DEFINE2, DEFINE3, ..............
5个回答

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 * 在两个模块中导入它们。


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

我强烈建议不要使用这种hack方法,但是它可以使您自动导入定义的常量,而无需逐个列出它们。

虽然我昨晚在脚本中实现了完全相同的模式,但我意识到它最重要的影响是,除非IDE实际执行脚本以收集标记,否则它会破坏大多数IDE中的智能感知/代码完成。这基本上就是为什么我回归到手动列出它们的明确方法 - 这样我的IDE就不会在波浪线下显示它们的用途了。如果你对此毫不关心 - 这种方法是解决问题的好方法! - synthesizerpatel

0

你不能只有一个包含常量的文件,然后调用它吗:

from file_constants import *

..?


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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接