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

How to avoid repeating lambda boilerplate in python?

我发现自己写了太多这些:

upper = lambda c   : c.upper()
lower = lambda c   : c.lower()
foo   = lambda a,b : a.foo(b)

我怎样才能避免或至少尽量减少这种样板文件?

是否(或不应该)有 PEP 允许 passing/calling 方法作为正常程序?

我真的不明白你在解决什么问题。你只是改变了你的方法

'abc'.upper()

upper('abc')

它并没有真正给你带来任何好处,事实上它的可读性差了一点。如果你使用 lambda 作为 key 传递给其他方法,你可以像

l = ['ab', 'Aa', 'ca']
sorted(l, key = str.upper)

请注意,我可以直接调用 str.upper 而无需定义 lambda

How can I avoid or at least minimize such boilerplate?

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

  • 使用c.upper()代替upper(c)
  • 使用c.lower()代替lower(c)
  • 使用a.foo(b)代替foo(a, b)

您可以使用未绑定的方法,而不是创建您自己的函数。

在前两个示例中,您可能需要 str.upperstr.lower。 (如果您需要支持超过 str,您可以使用 operator.methodcaller("upper") 或类似的,但请注意,同时处理 str 和 [=17 几乎肯定是一个糟糕的设计决策=] 具有相同代码的对象!)

你的第三个例子比较复杂。如果您只关心单一类型的 a 对象,那么您可以指定它并且它会像 str 示例(例如 A.foo)一样工作。类似地,如果 b 的值是常量并且提前知道,您可以使用 operator.methodcaller("foo", b) 来获得一个可调用对象,它为给定的 a 值调用 a.foo(b),但是它如果 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_methodcaller("foo")