传递函数将忽略的参数

pass a parameter which the function will ignore

假设我们有一个带有签名的简单 python 函数:

def foo(first, second, third=50)

当我从我的 main 调用它时,我总是有第一个和第二个参数,但我并不总是有第三个。

当我尝试从我使用的字典中获取第三个时:third = dict['value'] if 'value' in dict.keys() else None

问题是,当我传递这个 None 时,我希望函数使用其默认的第三个参数并且为 50,但它只使用 None。我也用 [].

试过了

有没有更优雅的方法来做到这一点,除了调用函数两次,取决于third是否存在,一次有它,一次没有,如下?

third = dict['value'] if 'value' in dict.keys() else None
if third:
    foo(first, second, third)
else:
    foo(first, second)

尝试:

if dict.get('value'):
    def foo(first, second, third)
else:
    def foo(first, second)

像这样重新定义函数怎么样:

def foo(first, second, third):
    if third == None:
        third = 50
    """ Your code here """

third = dict['value'] if 'value' in dict.keys() else 50

你可以这样做:

kwargs = {'third': dict['value']} if 'value' in dict else {}
foo(first, second, **kwargs)

第一行创建一个 kwargs 字典,如果 dict 中有 value,它只包含一个关键字 third,否则它是空的。在调用该函数时,您可以传播那个 kwargs 字典。

Python 中的函数对象有一个特殊的 属性 __defaults__。它是一个具有默认参数值的元组。因此,您可以从那里轻松获得 third 的默认值:

def foo(first, second, third=50):
    return third

dict = {}
print(foo(10, 20, dict.get('value', foo.__defaults__[0])))  # prints 50

dict = {"value": 100}
print(foo(10, 20, dict.get('value', foo.__defaults__[0])))  # prints 100

您可以使用列表理解对参数进行分组:

def foo(first,second,third=50): 
    print(first,second,third) 

args=[ a for a in [10,20,d.get("third",None)] if a!=None ]

foo(*args)                                                                                                           
10 20 50

我今天遇到了类似的问题。调用您的函数时,请执行以下操作:

foo(first, second, third=50)

third应该这样传的时候取值

您可以查看第三次通过的内容

if None in third:
    # do this
else:
    # do something else