有没有办法在Python中传递块参数而不首先将其定义为函数?
在Ruby中,块参数的工作方式如下:有没有办法在Python中传递块参数而不首先将其定义为函数?,python,callback,arguments,Python,Callback,Arguments,在Ruby中,块参数的工作方式如下: def foo_bar (&block) block.(4) end foo_bar do |x| puts x puts x * 2 end =begin 4 8 =end 我已经在Python中看到了以下等价物,但我发现它非常不令人满意,因为它需要定义函数,然后才将其作为参数传递: def foo_bar(block): block(4) def callback(x): print(x) p
def foo_bar (&block)
block.(4)
end
foo_bar do |x|
puts x
puts x * 2
end
=begin
4
8
=end
我已经在Python中看到了以下等价物,但我发现它非常不令人满意,因为它需要定义函数,然后才将其作为参数传递:
def foo_bar(block):
block(4)
def callback(x):
print(x)
print(x * 2)
foo_bar(callback)
'''
4
8
'''
Python中是否有其他替代方法,不需要先定义函数?不,Python不允许这种语法糖。它没有匿名函数;它提供的最接近的是lambdas,但它们有许多限制,即它们只能有一个表达式,即一行代码
使用
def
定义函数是创建可重用代码块的pythonic方法 我发现最接近于没有预先定义的回调函数的是decorator语法:
def loop_thru(block):
arr = [3, 76, 2, 8, 24]
for item in arr:
block(item)
@loop_thru
def puts(item):
print(item, end=" ") # 3 76 2 8 24
…尽管这样做仍然需要一个命名函数。当然还有
lambda
s:
loop_thru(lambda num: print(num, end=" "))
但是,它们有局限性:
- 它们仅限于一行代码
- 他们不允许
分配:=
:=
是合法的,:=
仅适用于变量,而不适用于属性或下标
foo = {}
bar = lambda: (foo['baz'] := 23)
'''
File "script.py", line 2
bar = lambda: (foo['baz'] := 23)
^
SyntaxError: cannot use named assignment with subscript
'''
不过,这太糟糕了。每种语言都会做出权衡。Python试图将可读性和惯用风格置于方便的速记之上。Ruby更注重表现力,不管下一个维护人员能想出什么。如果您喜欢ruby,请使用它。如果您出于某种原因不得不使用python,请尝试接受它试图做的事情,而不是违背规则。我知道,我只是不知道没有块参数对可读性如此重要。我的意思是“…块参数[是]如此…”
foo = {}
bar = lambda: (foo['baz'] := 23)
'''
File "script.py", line 2
bar = lambda: (foo['baz'] := 23)
^
SyntaxError: cannot use named assignment with subscript
'''