使用内置"getattr"的"functools.partial"和"



如果我完全遗漏了一些明显的东西,或者我没有认真研究文档,我很抱歉,但大约30分钟后,我找到了一个解决办法(没有理解我遇到的错误(。。。因此这里的问题来了。假设我有一个班:

class RGB(object):
def __init__(self, r, g, b):
super(RGB, self).__init__()
self.red = r
self.blue = b
self.green = g

并且我定义了CCD_ 1实例的列表如下:

from random import random
rr, gg, bb = [[random() for _ in range(20)] for _ in range(3)]
list_of_rgbs = [RGB(*item) for item in zip(rr, gg, bb)]

为什么我不能通过以下操作提取red值的列表:

from functools import partial
*reds, = map(partial(getattr, name="red"), list_of_rgbs)

*reds, = map(partial(getattr, "red"), list_of_rgbs)

我知道我可以通过说reds = [x.red for x in list_of_rbgs]让它做我想做的事,但如果要提取的属性列表来自其他地方,比如:attribs_to_get = ['red', 'blue'],那就很难了。在这种特殊情况下,我仍然可以通过来做我想做的事情

reds, blues = [[getattr(x, attrib) for x in list_of_rgbs] for attrib in attribs_to_get]

但我的问题是,是什么导致了这个错误。有人能解释为什么或如何使用partialmap吗?我有一种预感,这与这种行为有关(所以可能偏函数需要引用self?(,但我无法完全弄清楚。

作为参考,我在Python 3.7上。

Partial只能设置从第一个参数开始的位置参数。不能将第二个参数设置为位置参数,只能设置为关键字参数。由于getattr的第一个是对象,因此它与mapRGB0不能很好地协同工作。

但是,您可以使用operator.attrgetter():

from operator import attrgetter
*reds, _ = map(attrgetter("red"), list_of_rgbs)

最新更新