如何避免在python中重复lambda样板文件?

如何避免在python中重复lambda样板文件?,python,lambda,boilerplate,Python,Lambda,Boilerplate,我发现自己写了太多这样的东西: upper = lambda c : c.upper() lower = lambda c : c.lower() foo = lambda a,b : a.foo(b) 我怎样才能避免或至少减少这种陈词滥调 没有或者不应该有一个PEP来允许像正常过程一样传递/调用方法吗?我真的不知道你在解决什么问题。你只是在改变你的方法 'abc'.upper() 到 它并没有给你带来任何好处,事实上它的可读性稍差。如果您使用lambda作为键传递到其他方法中,

我发现自己写了太多这样的东西:

upper = lambda c   : c.upper()
lower = lambda c   : c.lower()
foo   = lambda a,b : a.foo(b)
我怎样才能避免或至少减少这种陈词滥调


没有或者不应该有一个PEP来允许像正常过程一样传递/调用方法吗?

我真的不知道你在解决什么问题。你只是在改变你的方法

'abc'.upper()

它并没有给你带来任何好处,事实上它的可读性稍差。如果您使用lambda作为键传递到其他方法中,您可以执行如下操作

l = ['ab', 'Aa', 'ca']
sorted(l, key = str.upper)
注意,我可以直接调用str.upper而不必定义lambda

我怎样才能避免或至少减少这种陈词滥调

不要用它!或者,更具体地说:

使用c.upper代替upperc 使用c.lower代替lowerc 使用a.foob代替fooa,b
您可以使用未绑定的方法,而不是创建自己的函数

在前两个示例中,您可能需要str.upper和str.lower。如果需要支持多个str,可以使用operator.methodcallerupper或类似的方法,但请注意,使用相同的代码处理str和bytes对象几乎肯定是一个错误的设计决策

你的第三个例子更复杂。如果你只关心一个单一类型的对象,那么你应该指定它,它的工作原理和str示例一样,例如a.foo。类似地,如果b的值是常量并且提前知道,则可以使用operator.methodcallerfoo,b获取一个可调用函数,该函数为给定的a值调用a.foob,但如果b也是变量,则没有帮助

如果您事先不知道a或b的类型,那么您确实需要坚持使用函数。如果不喜欢lambda表达式的外观,可以使用常规def语句:

def foo(a, b):
    return a.foo(b)
如果您经常使用它,您可以在methodcaller上编写自己的变体,以按需生成函数:

def my_methodcaller(method_name):
    def inner(obj, *args, **kwargs):
        return getattr(obj, method_name)(*args, **kwargs)
    return inner

然后,您可以使用foo=my\u methodcallerfoo。

为什么需要这个?我不记得曾经使用过这样的模式,我有经验。也许有更好的方法。我不会称之为样板;您唯一要“重用”的是lambda关键字。您可以使用operator.methodcaller或functools.partial,但在定义这些对象时不会保存任何字符。一种方法是根本不使用它,我不确定我是否理解它的意思。我不确定您所指的PEP,但PEP8说您在其中使用的类似列的对齐方式不是一种好的样式;。实际上,您通常不需要这样的样板文件。但是为什么您首先需要所有这些lambda呢?函数对象的优点是您可以将它们存储在映射中并动态应用它们。我同意,但是他的例子,特别是a.foob的例子,表明他/她的目标是在使用古典意义上的方法,因为他/她似乎更喜欢函数方法。如果他/她的目标是以地图式的方式应用方法,那么我认为我们有更好的建议,比如使用列表理解。
def my_methodcaller(method_name):
    def inner(obj, *args, **kwargs):
        return getattr(obj, method_name)(*args, **kwargs)
    return inner