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。
Partial 只能设置从第一个参数开始的位置参数。您不能将第二个参数设置为位置参数,而只能设置为关键字参数。由于第一个 forgetattr是对象,因此它不能与map和很好地配合使用partial。
但是您可以使用的是operator.attrgetter():
from operator import attrgetter
*reds, _ = map(attrgetter("red"), list_of_rgbs)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1459 次 |
| 最近记录: |