问题描述
如果您完全缺少明显的东西,或者如果我没有足够认真地研究文档,我深表歉意,但是大约30分钟后,我找到了解决方法(没有理解我得到的错误),并且...在这里提问。假设我有一堂课:
class RGB(object):
def __init__(self,r,g,b):
super(RGB,self).__init__()
self.red = r
self.blue = b
self.green = g
并且我定义了RGB
实例的列表,如下所示:
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,bb)]
为什么我不能通过以下操作来提取red
值的列表:
from functools import partial
*reds,= map(partial(getattr,name="red"),list_of_rgbs)
或
*reds,"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
使它起作用吗?我有一种预感,它与this behavior有关(因此,部分函数可能需要引用self
?),但我不太想弄清楚。
作为参考,我使用的是Python 3.7。
解决方法
Partial只能设置从第一个参数开始的位置参数。您不能将第二个参数设置为位置参数,而只能将其设置为关键字参数。由于getattr
的第一个对象是对象,因此无法与map
和partial
一起很好地工作。
但是您可以使用operator.attrgetter()
:
from operator import attrgetter
*reds,_ = map(attrgetter("red"),list_of_rgbs)