在toolz项目中,无论如何都要处理一个与函数类似的对象方法,这样我可以更好地撰写,咖喱等等。 更好的意思是可读性和类似的性能
这是一个微不足道的例子:
# given a list strings (names),
l = ["Harry" ,
"Sally " ,
" bEn " ,
" feDDy " ]
# Lets pretend I want to apply a few simple string methods on each item in the
# list (This is just an example), and maybe replace as it's multi-airity.
# Traditional python list comprehension:
print([x.strip().lower().title().replace('H','T') for x in l ])
['Tarry', 'Sally', 'Ben', 'Feddy']
# my attempt, at toolz, same question with compose, curry,
# functools.partial.
from toolz.functoolz import pipe, thread_last
thread_last(l,
(map , str.strip),
(map , str.lower),
(map , str.title),
(map , lambda x: x.replace('H','T')), # any better way to do this?
# I wish i had function/method `str.replace(__init_value__, 'H', 'T')` where the
# `__init_value` is what I guess would go to the str constructor?
list,
print)
我不喜欢所有额外的lambda ...我无法想象那会没事 为了表现。关于如何使用toolz改善这一点的任何提示?
使用operators
模块,我可以减少大多数操作员的痛苦和省略
lambdas用于加法,减法等等。
在最新版本的python中,方法调用有什么类似的东西吗?
答案 0 :(得分:3)
请注意,x.replace(y, z)
确实是str.replace(x, y, z)
。您可以使用partial
是经常使用的特定替代品。
同样适用于其他方法:如果通过类访问方法,则它是未绑定的,第一个参数(self
)是函数的正常参数。周围没有魔法。 (部分应用实例方法,将其self
值锁定到实例。)
因此,我冒险thread_last(l, (map, pipe(str.strip, str.lower, str.title))
将三个函数应用于每个字符串元素。
(如果您使用Python进入FP,请查看http://coconut-lang.org/)