python getattr 多层访问并传递值

5 投票
3 回答
5083 浏览
提问于 2025-04-30 17:45

我最近在研究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)

撰写回答