如何使用可选参数自定义Python函数?

-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)

我该怎么做呢?

Mar*_*ers 6

添加关键字参数:

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)

有关此问题的详细讨论,请参阅"最小惊讶"和可变默认参数.