2017-02-27 80 views
3

例如,我有一个函数对数据做了一些事情,并将一个名称作为可选参数。如果名称未提供,我想调用另一个参数来创建名称。所以,替代品似乎不是可以/ pythonic将另一个函数作为可选参数调用吗?

def do_something(data, name=get_name()): 
    ... 

def do_something(data, name=None): 
    if name is None: 
     name=get_name() 
    ... 

第一个似乎更给我,但我失去的东西吗?

+10

是的:你错过了'get_name'只会被调用一次的事实。见http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument –

+0

当然,这可能是你想要的...... –

+0

你可以稍微缩短第二个例子的名字= name或get_name()'。但丹尼尔是对的 - 第一个例子冒着引入非常微妙的错误的风险。 – abought

回答

4

这不是一回事。

get_name()在第一种情况的函数定义中被评估,而在第二种情况下被动态地评估。

有,你不能使用第一种方法的情况下,无论如何,使用方法调用的返回时像(self.method()

所以坚持到了第二个版本。我不知道它是不是pythonic,但至少这是一个很好的配方,它的工作原理。

0

我会写:

def do_something(data, func=get_name): 
    func() 

你传递给函数以后调用它。这与python中的函数是一对一的东西是一致的,因此,是安全的

+0

这假设调用者应该为这个参数传递一个函数,这不是OP正在做的事情。但对于其中一个应该将函数传递给函数的其他情况,这是一个很好的解决方案。 – SethMMorton

+0

对。然后,我需要如果func == get_name:func = func()在调用func之前,这看起来很有趣。我更喜欢OP的第二个选项。 – jnsod

相关问题