仅当未提供参数时多参数函数的默认参数

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