如何将参数作为默认值传递?
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
我想要的是 addTwice
的 numToAdd
始终使用 add
的 numToAdd
的默认值,无论它是什么。
原因:也许后来在代码中我意识到在执行 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
这让我可以快速更改默认值,并且两个函数使用相同的默认值。它明确且非常清楚;这是蟒蛇。
我想使用参数的默认值,但在调用中包含其名称。我认为将参数设置为 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
我想要的是 addTwice
的 numToAdd
始终使用 add
的 numToAdd
的默认值,无论它是什么。
原因:也许后来在代码中我意识到在执行 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_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
这让我可以快速更改默认值,并且两个函数使用相同的默认值。它明确且非常清楚;这是蟒蛇。