在Python中为函数赋值pass
我有一段代码,它定义了一个函数,该函数将函数作为参数,如下所示:在Python中为函数赋值pass,python,function,optional-parameters,optional-arguments,Python,Function,Optional Parameters,Optional Arguments,我有一段代码,它定义了一个函数,该函数将函数作为参数,如下所示: def stuff(n, f): f(n) def stuff(n, f = None): if(f is None): f = pass f(n) 现在,我想提供一些不起任何作用的默认值f。所以我想我应该使用pass,就像这样: def stuff(n, f): f(n) def stuff(n, f = None): if(f is None): f = pass f(n) 但这
def stuff(n, f):
f(n)
def stuff(n, f = None):
if(f is None):
f = pass
f(n)
现在,我想提供一些不起任何作用的默认值f。所以我想我应该使用pass,就像这样:
def stuff(n, f):
f(n)
def stuff(n, f = None):
if(f is None):
f = pass
f(n)
但这并不适用于编译。我该怎么做呢?你不能空着。但您可以创建内部函数,将其分配给
f
def stuff(n, f=None):
def empty(n):
pass
if f is None:
f = empty
f(n)
为什么不干脆这样呢
def stuff(n, f=None):
if f is None:
return
return f(n)
pass
是解释器的关键字,在其他情况下不占任何位置。它不是可以指定的对象。您可以使用无操作lambda
f = lambda x: None
稍微短一点:
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
通用noop函数:
f = lambda *x,**y:None
你可以打电话
f()
f(0,foo=0)
我会和一个朋友一起去
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()
关于格式:不要在函数签名中的
=
周围留空格。当我们记录格式时,不要用少于4个空格来缩进——2个空格基本上是不可读的——不要在条件句周围放括号,就像你在写C一样。每个人都说你应该读Ah,我的C++/Java/Perl背景显示=PIs您的第一个版本是Python3K吗?该语法似乎对Python2.7无效。@Bethor:谢谢,修复了。在2.6.0或更简单的版本上测试:def stuff(n,f=None):f和f(n)
@codecraft:确实如此。但我认为,在这种情况下,清晰度会受到不必要的影响。为控制流使用逻辑运算符使事情变得非常像perl,可能不是很像Pythonic小改进:建议使用is None
而不是==None
()。谢谢,我想知道哪一个是最好的,但从未想过要检查!答案相应固定。+1比其他解决方案好得多,因为它清楚地说明了目的。只要这个问题有一个“正确”的答案,就是它。其他答案都不必要地混淆了这样一个微不足道的函数。如果OP想要将函数对象传递给另一个函数,这种方法不起作用。OT,但是为什么设计者需要为noop创建一个新的关键字?bizarre@jberryman因为Python没有块分隔符。您通常会使用这样的语言编写{}
。但在Python中它将是。。。没有什么。所以pass
可以使其语法完整。@jberryman在哪里pass
只是一个关键字,用作其他空块的占位符。这可能会使解析更容易。它不是一个物体。None是指没有其他值的对象。它们有不同的语义。