将一个文件中的所有对象添加到另一个文件中的列表

Add all objects from one file to a list in another file

我有以下 python 文件 constants.py,其中存储了一堆常量:

ONE = 1
TWO = 2
ANOTHER = "Test"
....

我正在尝试导入所有变量并将它们添加到名为 data 的列表中。这是我到目前为止所拥有的,但是如果我向 constants.py 添加一个常量,那么我需要记住将它添加到 data 列表:

from constants import *
data = [ONE, TWO, ANOTHER, ...]

这里有更好的方法吗?

解决方案是在 constants.py 文件中创建列表。如下所示:

ONE = 1
TWO = 2
ANOTHER = "Test"
....
data = [ONE, TWO, ANOTHER, ...]

然后您只需在主文件中导入该列表即可。

一种方法是使用 importlib 模块。如果您的 constants.py 模块包含:

ONE = 1
TWO = 2
ANOTHER = "Test"

__all__ = [ "ONE", "TWO", "THREE", "ANOTHER" ]

您可以将它们作为模块导入:

>>> import importlib
>>> constants = importlib.import_module('constants')
>>> constants.ONE
1
>>> constants.__dict__
{ ... 'ONE': 1, 'TWO': 2, 'THREE': 3, 'ANOTHER': 'Test'}

由于 "dunder" 属性(__spec____builtins__ 等)的膨胀,包含 __all__ 属性会很有用。

>>> constants_dict = { k: constants.__dict__[k] for k in constants.__all__ }
>>> constants_dict
{'ONE': 1, 'TWO': 2, 'THREE': 3, 'ANOTHER': 'Test'}

如果变量以大写字母开头,你可以这样做

ONE = 1
TWO = 2
ANOTHER = "Test"

exec('data = [' + ','.join([e for e in dir() if e[0].isupper()]) + ']')

而且您不必记得将它们添加到 data

与其他响应有些相似,但不需要其他模块。

data = {name:getattr(constants, name) for name in dir(constants) if name[0] != '_'}
print(data) #Prints {'ANOTHER': 'Test', 'ONE': 1, 'TWO': 2}

注意这里的import语句应该是import constants而不是from constants import *.