【问题标题】:Assign pass to a function in Python将传递分配给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

标签: python function optional-parameters optional-arguments


【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 2015-02-09
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 2015-01-23
        • 1970-01-01
        相关资源
        最近更新 更多