是否可以在Python中更改函数的默认参数?

2024-10-06 12:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,是否可以在运行时重新定义函数的默认参数?

我在这里定义了一个有3个参数的函数:

def multiplyNumbers(x,y,z):
    return x*y*z

print(multiplyNumbers(x=2,y=3,z=3))

接下来,我尝试(未成功)设置y的默认参数值,然后尝试在不使用参数y的情况下调用函数:

multiplyNumbers.y = 2;
print(multiplyNumbers(x=3, z=3))

但由于未正确设置y的默认值,因此产生了以下错误:

TypeError: multiplyNumbers() missing 1 required positional argument: 'y'

是否可以在运行时重新定义函数的默认参数,就像我在这里所做的那样?


Tags: 函数参数return定义def错误required情况
3条回答

使用func_defaults作为

def myfun(a=3):
    return a

myfun.func_defaults = (4,)
b = myfun()
assert b == 4

检查文档中的函数默认值here

更新:看看里亚德的回答,我觉得我的回答太直白了。我不知道你问这个问题的上下文,但总的来说(在Zen of Python之后),我相信使用部分应用程序比重新定义函数的默认参数更好

从技术上讲,按你的要求做是可能的……但这不是个好主意。里亚德的回答是用Python的方式来做这件事。

在Python 3中:

>>> def f(x=1, y=2, z=3):
...     print(x, y, z)
>>> f()
1 2 3
>>> f.__defaults__ = (4, 5, 6)
4 5 6

与所有隐藏在文档中且难以在文档中找到的内容一样,^{}模块图是查找函数属性的最佳位置。

Python 2中的细节略有不同,但想法是相同的。(只需将docs页面左上角的下拉菜单从3.3更改为2.7。)


如果您想知道当Python只有一个元组时,它是如何知道哪些默认值与哪些参数一起使用的……它只是从末尾开始倒数(或者是**args**kwargs的第一个值——之后的任何值都进入__kwdefaults__dict)。f.__defaults = (4, 5)将默认值设置为yz设置为45,默认值为x。这是因为在默认参数之后不能有非默认参数。


在某些情况下,这是行不通的,但即使这样,您也可以将其永久复制到具有不同默认值的新函数:

>>> f2 = types.FunctionType(f.__code__, f.__globals__, f.__name__,
...                         (4, 5, 6), f.__closure__)

在这里,^{} module文档并没有真正解释任何东西,但是交互解释器中的help(types.FunctionType)显示了所需的参数。


只有内置函数才是不能句柄的情况。但它们通常没有实际的默认值;相反,它们在C API中伪造了类似的东西。

只需使用functools.partial

 multiplyNumbers = functools.partial(multiplyNumbers, y = 42)

这里有一个问题:您不能将其称为multiplyNumbers(5, 7, 9);您应该手动地说y=7

如果需要删除默认参数,我认为有两种方法:

  1. 将原始函数存储在某处

    oldF = f
    f = functools.partial(f, y = 42)
    //work with changed f
    f = oldF //restore
    
  2. 使用partial.func

    f = f.func //go to previous version.
    

相关问题 更多 >