如何避免在 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.upper
和 str.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")
。
我发现自己写了太多这些:
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.upper
和 str.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")
。