python getattr 多层访问并传递值
我最近在研究getattr这个函数,想知道它的等价写法是什么。
example = val1.val2.val3(item)
我明白要使用嵌套的getattr来处理多层属性。
example = getattr(getattr(val1, "val2"), "val3")
但是我该怎么表示传入的对象呢?
3 个回答
0
这可以通过安全的评估来解决。如果嵌套的属性可用,这样做是可以的。
fn_pointer = eval("val1.val2.val3", {}, {"val1": val1})
fn_pointer(item)
5
或者你可以使用标准库中的一个很方便的函数 operator.attrgetter。下面是一个简单的例子,教你怎么使用它。
from operator import attrgetter
from collections import namedtuple
# Define some objects
Foo = namedtuple('Foo', 'attr')
Bar = namedtuple('Bar', 'subattr1')
instance = Foo(attr=Bar('this_is_my_value'))
retriever = attrgetter('attr.subattr1')
result = retriever(instance)
print(result)
执行这个代码后,你会得到
this_is_my_value
3
你快到了:
val3 = getattr(getattr(val1, "val2"), "val3")
example = val3(item)
# Or simply:
example = getattr(getattr(val1, "val2"), "val3")(item)