【问题标题】:Python - passing a function (from scratch!) to another function?Python - 将一个函数(从头开始!)传递给另一个函数?
【发布时间】:2014-08-31 13:57:03
【问题描述】:

是否可以将一个从头编写的函数传递给另一个函数或类实例化?

这就是我现在拥有的:

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 的工作!这些函数可能非常复杂,在它们内部调用哪个函数并带有多个参数。另外,我不应该能够在其他任何地方访问它(所以外面的声明似乎不起作用)。

这样的事情可能吗?如果是这样,怎么做?如果不是,那么做我想做的事情的最佳方法是什么?

谢谢!!!

【问题讨论】:

  • exec('\n'.join("def newfunction(param1, param2):", " return param1 + param2"))
  • 如果它很复杂,为什么要将它塞进一行而不是使用def 语句?

标签: python function class instantiation anonymous


【解决方案1】:

您无法在 Python 中执行此操作,超出 lambda 的限制。

但是你可以在调用的正上方定义函数并将其传入,即使你在另一个作用域中,也可以将它的名字作为一个临时变量,不会污染你的地址空间。

两者的逻辑区别

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 “排除在外”的原因归结为:

  1. 有多少人不会将超过三行的内联计算分配给局部变量?
  2. 这些函数中有多少少于三行?
  3. 那何必呢?

(我总是使用下划线来做这件事。下划线标记这些“私有”,但它们通常不是成员,所以它只是强调它们是短暂的。如果范围界定迫使他们成为成员,它会提示人们它们是内部的,不适合更广泛的使用。如果您对类的混乱完全偏执,请一遍又一遍地使用相同的,并在类定义的末尾删除它们。)。

【讨论】:

    【解决方案2】:

    您要问的实际上是一种内联定义函数的方法。

    不幸的是,python 不支持这个。以前有人问过这个问题。

    在这个PEP

    lambda 不会被重命名。

    在某一时刻 lambda 计划在 Python 3000 中删除。不幸的是,没有人能够想出更好的方法来提供匿名函数。所以 lambda 将继续存在。

    但它会保持原样。添加对语句的支持是不可能的。它需要允许多行 lambda 表达式,这意味着多行表达式可能突然存在。例如,这将允许函数调用的多行参数。这简直丑陋。

    线程:“genexp 语法/lambda”,http://mail.python.org/pipermail/python-3000/2006-April/001042.html

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多