[英]Python - passing a function (from scratch!) to another function?
是否可以将从头开始编写的函数传递给另一个函数或类实例化?
这就是我现在所拥有的:
class Foo(Object):
def __init__(self, name, somefunction):
self.name = name
self.somefunction = somefunction
def afunction(param1, param2):
return param1 + param2
Bar = Foo("Something", afunction)
Bar.somefunction(2, 3)
#returns 5
我想知道是否有可能不必声明afunction
事前,而只是直接写代码作为参数传递给somefunction
实例化过程中。 像这样的东西?
class Foo(Object):
def __init__(self, name, somefunction):
self.name = name
self.somefunction = somefunction
Bar = Foo("Something", def afunction(param1, param2): return param1 + param2)
#OR
Bar = Foo("Something", Anonymousfunctiontechnique: return param1 + param2)
Bar.somefunction(2, 3)
#returns 5
而且,这不是lambda的工作! 这些函数可能非常复杂,函数调用内部函数和多个参数。 此外,我不应该在其他任何地方访问它(所以外面的声明似乎不起作用)。
这样的事情可能吗? 如果是这样,怎么样? 如果没有,那么做我想做的最好的方法是什么?
谢谢!!!
除了lambda的限制之外,你不能在Python中做到这一点。
但是你可以在调用之上定义函数并将其传入,即使你在另一个范围内,使其名称成为一个临时变量,不会污染你的地址空间。
两者之间的逻辑区别
Bar = Foo("Something", def afunction(param1, param2): return param1 + param2)
和
def _foo(param1, param2): return param1 + param2
Bar = Foo("Something", _foo)
两者之间的差异是一样的
Bar = foo(param1 + param2)
和
_good_name = param1 + param2
Bar = foo(_good_name)
具有任何复合计算的名称是出于文档目的的好主意。 它还可以帮助人们使用任何好的调试器。 它将格式化考虑因素降至最低。 总而言之 - 只需命名 。
这被“遗漏”的原因归结为:
(我总是使用下划线做这个。下划线标记这些'私人',但它们通常不是成员,所以它只是强调它们是短暂的。如果范围强迫它们成为成员,它会让人们知道它们是内部的而不是更广泛的消费。如果你是完全偏执类杂波,反复使用同那些和德尔他们在类定义的结束)。
你问的是真正的内联函数定义方法。
不幸的是,python不支持这一点。 人们之前已经问过这件事。
在这个PEP中 :
lambda不会被重命名。
有一次,lambda将在Python 3000中被删除。不幸的是,没有人能够提出一种更好的方式来提供匿名功能。 所以lambda就在这里。
但它仍然保持原样。 添加对语句的支持是非首发。 这将需要允许多行lambda表达式,这意味着可能突然存在多行表达式。 例如,这将允许函数调用的多行参数。 这简直太丑了。
线程:“genexp syntax / lambda”, http ://mail.python.org/pipermail/python-3000/2006-April/001042.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.