使用带有内置`getattr`的`functools.partial`和`map`吗?

问题描述

如果您完全缺少明显的东西,或者如果我没有足够认真地研究文档,我深表歉意,但是大约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]

但是我的问题是什么导致错误。有人可以解释为什么,或者如何使用partialmap使它起作用吗?我有一种预感,它与this behavior有关(因此,部分函数可能需要引用self?),但我不太想弄清楚。

作为参考,我使用的是Python 3.7。

解决方法

Partial只能设置从第一个参数开始的位置参数。您不能将第二个参数设置为位置参数,而只能将其设置为关键字参数。由于getattr的第一个对象是对象,因此无法与mappartial一起很好地工作。

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...