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

时间:2017-06-06 21:57:08

标签: python function named-parameters

我想使用参数的默认值,但在调用中包含其名称。我认为将参数设置为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的{​​{1}}总是使用默认的numToAdd add,无论它是什么。

原因:可能在代码后面我意识到在执行numToAdd时添加2作为默认值比添加1更好。

所以我把它改成

add

但是,除非我总是在def add(num, numToAdd=2): return num+numToAdd 中指定使用默认值(如果它收到默认值),否则这将无济于事。

所以,这就是基本原理。

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

4 个答案:

答案 0 :(得分:4)

没有明确使用参数默认值的内置支持。如果您不想在呼叫网站上保留参数,则必须非常手动检索默认值:

import inspect

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

在大多数情况下都不值得。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如何进行此操作有great answer(如果您确定我所要求的默认获取功能确实是您想要的)。但是,我只是想指出,实际上,我相信我试图实现的目标通常是使用全局变量完成的。

也就是说,通常要做的事情是:

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

这使我可以快速更改默认值,并且两个功能使用相同的默认值。这是很明确的,很清楚的。这是pythonic。