将 `functools.partial` 和 `map` 与内置的 `getattr` 一起使用?
Using `functools.partial` and `map` with built-in `getattr`?
如果我完全遗漏了一些明显的东西或者如果我没有足够深入地研究文档,我深表歉意,但在 30 分钟左右后我找到了解决方法(没有理解我得到的错误)并且......因此这里的问题。假设我有一个 class:
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, 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
和 partial
.
一起使用
然而你可以使用的是 operator.attrgetter()
:
from operator import attrgetter
*reds, _ = map(attrgetter("red"), list_of_rgbs)
如果我完全遗漏了一些明显的东西或者如果我没有足够深入地研究文档,我深表歉意,但在 30 分钟左右后我找到了解决方法(没有理解我得到的错误)并且......因此这里的问题。假设我有一个 class:
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, 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
和 partial
.
然而你可以使用的是 operator.attrgetter()
:
from operator import attrgetter
*reds, _ = map(attrgetter("red"), list_of_rgbs)