仅当未提供参数时多参数函数的默认参数
Default argument for a multiple argument function only when no argument supplied
让我们考虑一个接受多个参数的函数,如下所示:
def my_function(*args):
my_list = []
for _ in args:
my_list.append(_)
another_function(my_list)
现在,我在我的场景中面临的问题是:我需要 my_list
包含至少一个值,任何参数,但至少包含一个。
一个用户可以做my_function(arg1)
、my_fuynction(arg1,arg2)
、my_function(arg1,arg2,arg3)
等等。但是如果用户 my_function()
,我需要为函数提供一个默认参数(比如 arg1)。
如果我输入默认参数,则参数 defaultarg 将是强制性的,并且必须为其提供一些值:
def my_function(defaultarg, *args):
#function
如果我把它作为可选参数,那么我将不得不为参数提供一个默认值:
def my_function(optionalarg = defaultvalue, *args):
#function
这两种方式对我都不起作用,因为我不能强制使用它,也不能为其提供默认值。
如何创建此函数,以便在未传递任何参数时,该函数假定已传递一个参数?
截至目前,我通过在函数中放置一个 if...else 来处理此问题,如下所示:
def my_function(*args):
my_list = []
if len(args) == 0:
my_list.append('defaultarg')
else:
for _ in args:
my_list.append(_)
another_function(my_list)
有更好的方法吗?
I can't give a default value for it
我不明白你问题的这一部分。您在自己的解决方案中提供了默认值 'defaultarg'
?!我的回答假设您可以从某处获取默认值。
无论如何,如果您想保留 f(*args)
签名,您可以检查 args
元组是否为空并提供默认值。
def my_function(*args):
if not args:
args = (default_value,)
# more code
或
def my_function(*args):
if not args:
return my_function(default_value)
# more code
您不会绕过显式检查 args
是否为空,但也许您会比您的版本更喜欢这些建议之一。
编辑:
你也可以写一个参数化装饰器。
def with_default_value(default_value):
def with_default_value_decorator(f):
def f_new(*args):
if not args:
return f(default_value)
return f(*args)
return f_new
return with_default_value_decorator
示例:
@with_default_value('hi')
def my_print(*args):
print(' '.join(args))
演示:
>>> my_print('hello', 'world')
hello world
>>> my_print()
hi
让我们考虑一个接受多个参数的函数,如下所示:
def my_function(*args):
my_list = []
for _ in args:
my_list.append(_)
another_function(my_list)
现在,我在我的场景中面临的问题是:我需要 my_list
包含至少一个值,任何参数,但至少包含一个。
一个用户可以做my_function(arg1)
、my_fuynction(arg1,arg2)
、my_function(arg1,arg2,arg3)
等等。但是如果用户 my_function()
,我需要为函数提供一个默认参数(比如 arg1)。
如果我输入默认参数,则参数 defaultarg 将是强制性的,并且必须为其提供一些值:
def my_function(defaultarg, *args):
#function
如果我把它作为可选参数,那么我将不得不为参数提供一个默认值:
def my_function(optionalarg = defaultvalue, *args):
#function
这两种方式对我都不起作用,因为我不能强制使用它,也不能为其提供默认值。
如何创建此函数,以便在未传递任何参数时,该函数假定已传递一个参数?
截至目前,我通过在函数中放置一个 if...else 来处理此问题,如下所示:
def my_function(*args):
my_list = []
if len(args) == 0:
my_list.append('defaultarg')
else:
for _ in args:
my_list.append(_)
another_function(my_list)
有更好的方法吗?
I can't give a default value for it
我不明白你问题的这一部分。您在自己的解决方案中提供了默认值 'defaultarg'
?!我的回答假设您可以从某处获取默认值。
无论如何,如果您想保留 f(*args)
签名,您可以检查 args
元组是否为空并提供默认值。
def my_function(*args):
if not args:
args = (default_value,)
# more code
或
def my_function(*args):
if not args:
return my_function(default_value)
# more code
您不会绕过显式检查 args
是否为空,但也许您会比您的版本更喜欢这些建议之一。
编辑:
你也可以写一个参数化装饰器。
def with_default_value(default_value):
def with_default_value_decorator(f):
def f_new(*args):
if not args:
return f(default_value)
return f(*args)
return f_new
return with_default_value_decorator
示例:
@with_default_value('hi')
def my_print(*args):
print(' '.join(args))
演示:
>>> my_print('hello', 'world')
hello world
>>> my_print()
hi