将传递分配给Python中的函数

Posted

技术标签:

【中文标题】将传递分配给Python中的函数【英文标题】:Assign pass to a function in Python 【发布时间】:2011-07-05 15:46:45 【问题描述】:

我有一段代码定义了一个将函数作为参数的函数,如下所示:

def stuff(n, f):
  f(n)

现在,我想提供一些 f 的默认值,它什么都不做。所以我想我会使用 pass,就像这样:

def stuff(n, f = None):
  if(f is None):
    f = pass
  f(n)

但这不会编译。我该怎么做?

【问题讨论】:

关于格式:不要在函数签名中的=周围留空格。 当我们对格式进行微调时,不要使用少于 4 个空格进行缩进——2 个空格本质上是不可读的——并且不要在条件句周围加上括号,就好像你在写 C . 大家都说你应该阅读PEP 8 啊,我的 C++/Java/Perl 背景显示 =P 【参考方案1】:

pass 是解释器的关键字,是其他任何内容的占位符。它不是您可以分配的对象。您可以使用无操作 lambda。

f = lambda x: None

【讨论】:

OT,但为什么设计师需要创建一个新的关键字只是为了一个 noop?奇怪的 @jberryman 因为 Python 没有块分隔符。在这种语言中,您通常会写成。但在 Python 中,它将是......什么都没有。所以pass 是为了让它在语法上完整。 @jberryman 在哪里? pass 只是一个关键字,用作其他空块的占位符。它可能使解析更容易。它不是一个对象。 None 是一个没有其他值的对象。它们有不同的语义。【参考方案2】:

为什么不简单呢?

def stuff(n, f=None):
    if f is None:
        return
    return f(n)

【讨论】:

小改进:PEP8 建议使用is None 而不是== None (rationale)。 谢谢,我想知道哪个最好,但从没想过要检查!答案相应固定。 +1 比其他解决方案好得多,因为它清楚地说明了意图。 只要这个问题有一个“正确”的答案,就是这样。其他答案都不必要地混淆了这样一个微不足道的功能。 如果 OP 想要将函数对象传递给另一个函数,这种方法是行不通的。【参考方案3】:

短一点:

def stuff(n, f=None):
  f = f or (lambda x: None)
  f(n)

甚至更好:

def stuff(n, f=None):
    f(n) if f is not None else None

【讨论】:

你的第一个版本是 Python3K 吗?该语法似乎对 python 2.7 无效。 @Bethor:谢谢,已修复。在 2.6 上测试。 或更简单:def stuff(n, f = None): f and f(n) @codecraft:确实。但我认为,在这种情况下,清晰度会受到不必要的影响。 同意。对控制流使用逻辑运算符会使事情变得非常类似于 perl,并且可能不是很 Python 【参考方案4】:

你不能说空话。但是您可以创建内部函数,将其分配给f

def stuff(n, f=None):
  def empty(n):
    pass
  if f is None:
    f = empty
  f(n)

【讨论】:

【参考方案5】:

通用 noop 函数:

f = lambda *x,**y:None

你可以打电话

f()
f(0,foo=0)

【讨论】:

【参考方案6】:

我会选择一个

def nop(*args, **kwargs):
    pass

def algo(func=nop):
    do_something()
    func()
    do_something_else()

algo() # nop is called
algo(some_callback) # some_callback is called

恕我直言看起来比

if foo:
    foo()

【讨论】:

以上是关于将传递分配给Python中的函数的主要内容,如果未能解决你的问题,请参考以下文章

将变量和列表传递给 Python 中的函数

如何将文本文件中的值分配给python函数中的数组并将其用作全局?

将图像指针传递给python中的DLL函数

将函数的输出分配给python中的空列表常量[重复]

将派生类传递给采用 SWIG Python 中的基类的函数

将HTML表单变量传递给Django中的python函数