使用带有内置“getattr”的“functools.partial”和“map”?

ITA*_*ITA 1 python-3.x functools

如果我完全遗漏了一些明显的东西,或者如果我没有足够努力地研究文档,我深表歉意,但在 30 分钟左右后,我找到了一个解决方法(没有理解我遇到的错误)并且......因此这里的问题。假设我有一堂课:

class RGB(object):
    def __init__(self, r, g, b):
        super(RGB, self).__init__()
        self.red = r
        self.blue = b
        self.green = g
Run Code Online (Sandbox Code Playgroud)

我定义了一个实例列表,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, gg, bb)]
Run Code Online (Sandbox Code Playgroud)

为什么我不能通过执行以下操作来提取值列表red

from functools import partial
*reds, = map(partial(getattr, name="red"), list_of_rgbs)
Run Code Online (Sandbox Code Playgroud)

或者

*reds, = map(partial(getattr, "red"), list_of_rgbs)
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过说让它做我想做的事情,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]
Run Code Online (Sandbox Code Playgroud)

但我的问题是导致错误的原因。有人可以解释为什么,或者如何使用partialand使其工作map吗?我有一种预感,它与这种行为有关(所以也许部分函数需要引用self?),但我不能完全弄清楚它。

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

Bha*_*rel 6

Partial 只能设置从第一个参数开始的位置参数。您不能将第二个参数设置为位置参数,而只能设置为关键字参数。由于第一个 forgetattr是对象,因此它不能与map和很好地配合使用partial

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

from operator import attrgetter
*reds, _ = map(attrgetter("red"), list_of_rgbs)
Run Code Online (Sandbox Code Playgroud)

  • 我不知道“operator.attrgetter”。这似乎是一个方便的模块。我应该明白我想做的正是[这个](/sf/ask/782156231/无需关键字)。 (2认同)