如果我完全遗漏了一些明显的东西,或者我没有认真研究文档,我很抱歉,但大约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]
但我的问题是,是什么导致了这个错误。有人能解释为什么或如何使用partial
和map
吗?我有一种预感,这与这种行为有关(所以可能偏函数需要引用self
?(,但我无法完全弄清楚。
作为参考,我在Python 3.7上。
Partial只能设置从第一个参数开始的位置参数。不能将第二个参数设置为位置参数,只能设置为关键字参数。由于getattr
的第一个是对象,因此它与map
和RGB
0不能很好地协同工作。
但是,您可以使用operator.attrgetter()
:
from operator import attrgetter
*reds, _ = map(attrgetter("red"), list_of_rgbs)