-3 python
这里有很多关于这类问题的讨论,但我没有看到任何关于如何实现这样一个函数的内容.
假设我有一个内部Foo()有函数的类bar().
该函数bar()接受no或只有一个参数.当它什么都没有时,属性被设置为2.否则,它被设置为输入的任何值.即
In [32]: foo = Foo()
In [33]: foo.bar()
In [34]: foo.a
Out [34]: 2
Run Code Online (Sandbox Code Playgroud)
和
In [32]: foo = Foo()
In [33]: foo.bar(5)
In [34]: foo.a
Out [34]: 5
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
添加关键字参数:
def bar(self, value=2):
self.a = value
Run Code Online (Sandbox Code Playgroud)
这里value默认为2,如果没有明确给出:
>>> foo = Foo()
>>> foo.bar()
>>> foo.a
2
>>> foo.bar(5)
>>> foo.a
5
Run Code Online (Sandbox Code Playgroud)
请注意,函数签名只创建一次 ; 默认值存储在功能对象上.一个常见的错误是假设每次调用函数时都会评估默认值,这可能会导致一些意外:
import datetime
def ham(now=datetime.datetime.now()):
print now
Run Code Online (Sandbox Code Playgroud)
这里now将修复bar导入的时刻和Python创建的函数对象:
>>> ham()
2013-10-24 10:20:26.024775
>>> # wait some time
...
>>> ham()
2013-10-24 10:20:26.024775
Run Code Online (Sandbox Code Playgroud)
当默认值是可变的时,它仍然更令人惊讶:
def eggs(param, value=[]):
value.append(param)
print value
Run Code Online (Sandbox Code Playgroud)
重复调用eggs(2)将导致value列表增长,2每次调用时都会向列表中添加一个新值:
>>> eggs(2)
[2]
>>> eggs(2)
[2, 2]
>>> eggs(2)
[2, 2, 2]
Run Code Online (Sandbox Code Playgroud)
有关此问题的详细讨论,请参阅"最小惊讶"和可变默认参数.