将一个文件中的所有对象添加到另一个文件中的列表
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 *
.
我有以下 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 *
.