python toolz - 组合方法(与函数形成对比)

时间:2017-12-15 22:04:34

标签: python toolz

在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中,方法调用有什么类似的东西吗?

1 个答案:

答案 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/