如何导入大量全局变量而不列出每个变量?(Python)

如何导入大量全局变量而不列出每个变量?(Python),python,import,Python,Import,假设一个文件有10个全局常量,我想导入到另一个文件中 有没有更简单的方法来导入所有全局常量,而不必执行以下操作:from file_one.py import*。我不希望它导入整个文件,只导入全局变量 DEFINE1 = 1 DEFINE2 = 2 DEFINE3 = 3 ... DEFINE10 = 10 假设所有大写名称都是全局常量: from file_one.py import DEFINE1, DEFINE2, DEFINE3, .............. 或更短: import

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

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

DEFINE1 = 1
DEFINE2 = 2
DEFINE3 = 3
...
DEFINE10 = 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)

话虽如此:不要这样做。显式比隐式好。您应该将这些常量放在一个单独的模块中,并首先使用
from constants import*

将它们导入两个模块中,我认为可以像您现在这样创建大量常量,并将它们全部放入
constants.py
文件中,然后从常量导入执行
*
-我一直都在这样做。只要我的所有常量都在该文件中定义,当我需要找出某个常量的来源时,我就知道应该在哪里查找

但我现在假设你有一个有很多常量的模块,它们都由大写字母、数字和下划线组成。在这一点上,你可以做一些非常粗俗的事情,比如

import file_one
globals().update((key, getattr(file_one, key)) for key in dir(file_one)
                                               if key.isupper())

我强烈建议不要使用这种黑客手段,但这样可以自动导入您定义的常量,而不必单独列出它们。

您不能只拥有一个包含常量的文件,然后调用:

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()
然后您可以这样引用它:

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
然后要导入这些内容,请执行以下操作(在导入时不使用“.py”):

这也允许您将常量分组为有意义的子集:

from file_one import constants

只需导入颜色或线型。这将使您的常量在模块中具有某种名称空间,这样您就可以限制导入,避免名称冲突。

昨晚我在脚本中实现了完全相同的模式,我意识到它将产生的最重要的影响是,它将破坏大多数IDE中的intellisense/代码完成,除非它们实际执行脚本作为收集令牌的一部分。这就是为什么我恢复了手动列出它们的显式方法——这样我的IDE就不会用红色波浪下划线显示它们的用途了。如果你对此不屑一顾,这个方法是解决这个问题的好办法!