【发布时间】:2013-06-29 22:23:03
【问题描述】:
在 Python 中,是否可以为变量设置一个值,以便在将其传递给函数时,该函数将使用参数的默认值?例如:
def my_function( a = "default_value" ) :
print a
my_function( my_variable )
将打印“默认值”。这样做会是 Pythonic 吗?
【问题讨论】:
在 Python 中,是否可以为变量设置一个值,以便在将其传递给函数时,该函数将使用参数的默认值?例如:
def my_function( a = "default_value" ) :
print a
my_function( my_variable )
将打印“默认值”。这样做会是 Pythonic 吗?
【问题讨论】:
你通常会不这样做;你把参数完全去掉,让python来填写默认值:
my_function()
您可以使用 inspect.getargspec() function 从函数中检索默认值。
from inspect import getargspec
defaults = getargspec(my_function).defaults
my_variable = defaults[0]
my_function(my_variable)
你的例子当然很简单;它只需要 one 你知道有一个默认值的参数。在更常见的情况下,还有位置参数,它们没有默认值。
要重构哪些参数具有默认值,您需要重新组合参数及其默认值:
argspec = getargspec(my_function)
keyword_args = dict(zip(argspec.args[-len(argspec.defaults):], argspec.defaults))
positional_args = [None] * (len(argspec.args) - len(argspec.defaults)) # set all positionals to None
my_function(*positional_args, **keyword_args)
演示:
>>> from inspect import getargspec
>>> defaults = getargspec(my_function).defaults
>>> my_variable = defaults[0]
>>> my_function(my_variable)
default_value
>>> argspec = getargspec(my_function)
>>> keyword_args = dict(zip(argspec.args[-len(argspec.defaults):], argspec.defaults))
>>> positional_args = [None] * (len(argspec.args) - len(argspec.defaults)) # set all positionals to None
>>> my_function(*positional_args, **keyword_args)
default_value
>>> keyword_args
{'a': 'default_value'}
【讨论】:
使用默认参数的一个常见习惯用法是,除了不传递值之外,将参数设置为默认值为 None,然后如果它是 None,则使用默认值,例如:
def my_function(a=None):
if a is None:
a = "default_value"
print a
然后你可以将None 传递给函数,它不会杀死默认参数。
my_variable = None
my_function(my_variable) # prints 'default_value'
如果您有多个具有相似签名的函数,您可能希望这样做,例如:
def func1(a=None, b=None):
print b
func2(a)
def func2(a=None):
if a is None:
a = 'default value'
print a
【讨论】: