繁体   English   中英

Python - 将函数(从头开始!)传递给另一个函数?

[英]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)

具有任何复合计算的名称是出于文档目的的好主意。 它还可以帮助人们使用任何好的调试器。 它将格式化考虑因素降至最低。 总而言之 - 只需命名

这被“遗漏”的原因归结为:

  1. 有多少人不会将三行内联计算分配给局部变量?
  2. 这些功能中有多少不到三行?
  3. 那为什么要这么麻烦?

(我总是使用下划线做这个。下划线标记这些'私人',但它们通常不是成员,所以它只是强调它们是短暂的。如果范围强迫它们成为成员,它会让人们知道它们是内部的而不是更广泛的消费。如果你是完全偏执类杂波,反复使用同那些和德尔他们在类定义的结束)。

你问的是真正的内联函数定义方法。

不幸的是,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM