如何将参数作为默认值传递?

How to pass a parameter as a default?

我想使用参数的默认值,但在调用中包含其名称。我认为将参数设置为 None 可以做到这一点,但事实并非如此。

例如:

def a(num=3):
    print(num)

a(num=None) #returns "None", not "3" like I want it to.

如何在将命名参数包含在调用中时使用它的默认值? (甚至可能吗?)

只是为了解释为什么我想做这样的事情(因为这可能是我整体编码风格的问题):

我经常遇到这样的代码

def add(num, numToAdd=1):
    return num+numToAdd

def addTwice(num, numToAdd=None):
    for i in range(2):
        num=add(num, numToAdd=numToAdd)
    return num

addTwice(3) #throws an error instead of returning 5

我想要的是 addTwicenumToAdd 始终使用 addnumToAdd 的默认值,无论它是什么。

原因:也许后来在代码中我意识到在执行 add 时默认加 2 比加 1 更好。

所以我改成

def add(num, numToAdd=2):
        return num+numToAdd

但是,除非我始终可以在 addTwice 中指定在收到默认值时使用默认值,否则这将无济于事。

所以,这就是理由。

换句话说:我有一个函数(第一个函数)调用另一个函数(第二个函数),如果第一个函数必须使用默认值,我希望它默认为默认值第二个函数的值。这样,我只需要更改第二个函数的默认值(不是每个调用它的函数)就可以更改默认功能。

不,你不能:这是自相矛盾的。当且仅当您在参数列表中提供值时,才使用默认值。如果您提供一个值,则默认值 不能 在例程中使用。

def a(num=None):
    if num is None: 
       num = 3
    print(num)

a(num=None)  # prints 3
a() # prints 3

...我猜...也许

或者解释默认参数

def a(num=3):
   print(num)

a(num=None) # prints None
a() # prints 3

没有内置支持显式使用参数的默认值。如果您不想在调用站点遗漏参数,则必须非常手动地检索默认值:

import inspect

a(num=inspect.signature(a).parameters['num'].default)

在大多数情况下不值得。

关于如何执行此操作的 (如果您确定我要求的 default-getting 功能确实是您想要的)。但是,我只是想指出,在实践中,我相信我试图实现的目标通常是使用全局变量完成的。

也就是说,做我想做的事情的通常方法是:

DEFAULT_NUM_TO_ADD = 1
def add(num, numToAdd=DEFAULT_NUM_TO_ADD):
    return num+numToAdd

def addTwice(num, numToAdd=DEFAULT_NUM_TO_ADD):
    for i in range(2):
        num=add(num, numToAdd=numToAdd)
    return num

addTwice(3) # returns 5

这让我可以快速更改默认值,并且两个函数使用相同的默认值。它明确且非常清楚;这是蟒蛇。