将传递分配给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中的函数的主要内容,如果未能解决你的问题,请参考以下文章