我有一个python脚本,它定义了几个这样的对象
# A.py
a - some dict
b - some dict
c - some dict
d - some dict
现在,我还有另一个脚本B.py
,我想在其中访问a,b,c,d,但是它基于某些变量,我会选择使用哪个脚本
# By.py
import A as A_objects
input = 'a'
# Since the input is 'a' here, I want to call A_objects.a.value
print(A_objects.input.value) # Does not work
这是错误:
AttributeError: module 'A' has no attribute 'input'
对我来说,这听起来像是一个基本问题,但我找不到解决方案。我想到的一种方法是创建一个包含字符串和诸如此类的对象的字典
global_dict = { 'a': a, 'b': b ... }
在global_dict.get(input)
中以B.py
的形式获取对象/字典
让我知道实现此用例的最佳实践是什么。
答案 0 :(得分:3)
您只需执行getattr(A_objects, input)
答案 1 :(得分:1)
您的问题不是“从另一个模块访问对象”,而是通过其名称来解析属性(模块中定义的名称成为模块对象的属性)。对于任何对象,您都会遇到完全相同的问题,即:
class Foo():
def __init__(self):
self.a = 42
f = Foo()
name = 'a'
# now how to get 'f.<name>' ?
通用答案是内置的getattr(object, name[, default])
函数:
print(f.a)
print(getattr(f, name))
因此,对于B.py,您想要的是
print(getattr(A_objects, input))
但是,如果要处理用户输入(对于“用户输入”的最大可能定义),则您很可能希望明确定义可以通过这种方式访问的名称-使用dict是最明显的解决方案:
# a.py
a = {}
b = {}
# etc
registry = {
"a": a,
"b": b,
# etc
}
和:
# B.py
import A
input = 'a'
print(A.registry[input])