如何告诉函数使用默认参数值?

sds:

我有一个函数foo调用math.isclose

import math
def foo(..., rtol=None, atol=None):
    ...
    if math.isclose(x, y, rel_tol=rtol, abs_tol=atol):
        ...
    ...

上述失败的math.isclose,如果我不通过rtol,并atolfoo

TypeError: must be real number, not NoneType

我不想将系统默认参数值放入我的代码中(如果后来改变了该怎么办?)

到目前为止,这是我想到的:

import math
def foo(..., rtol=None, atol=None):
    ...
    tols = {}
    if rtol is not None:
        tols["rel_tol"] = rtol
    if atol is not None:
        tols["abs_tol"] = atol
    if math.isclose(x, y, **tols):
        ...
    ...

这看起来很长,很愚蠢,并且dict在每次调用时都分配一个foo(递归调用自身,所以这重要)。

那么,告诉math.isclose使用默认公差的最佳方法是什么

PS。有几个相关的问题。请注意,我并不想知道实际的默认参数math.isclose-所有我希望它告诉它使用任何他们都是默认的。

gmds:

一种解决方法是可变参数展开:

def foo(..., **kwargs):
    ...
    if math.isclose(x, y, **kwargs):
        ...

这将允许你指定atolrtol作为关键字参数的主要功能foo,它会再传给不变math.isclose

但是,我还要说的是,传递参数以kwargs某种方式修改函数的行为,而不仅仅是传递给被调用的子函数,这是很习惯的做法。因此,我建议改用一个参数命名,这样很明显它将被解压缩并原样传递给子函数:

def foo(..., isclose_kwargs={}):
    ...
    if math.isclose(x, y, **isclose_kwargs):
        ...

您可以在中看到一个等效的模式matplotlib(示例:plt.subplots- subplot_kwgridspec_kw,所有其他关键字参数都作为传递给Figure构造函数**fig_kw)和seaborn(示例:FacetGrid- subplot_kwsgridspec_kws)。

当有这特别明显多发,你可能想通过关键字参数,但在其他方面保留默认行为子功能:

def foo(..., f1_kwargs={}, f2_kwargs={}, f3_kwargs={}):
    ...
    f1(**f1_kwargs)
    ...
    f2(**f2_kwargs)
    ...
    f3(**f3_kwargs)
    ...

警告:

请注意,默认参数仅实例化一次,因此您不应dicts在函数中修改空值。如果需要,您应该改为使用None默认参数,并在dict每次运行该函数时实例化一个新的空值:

def foo(..., isclose_kwargs=None):
    if isclose_kwargs is None:
        isclose_kwargs = {}
    ...
    if math.isclose(x, y, **isclose_kwargs):
        ...

我的偏好是避免这种情况,因为它比较简短,因此您不知道自己在做什么,而且一般而言,我不喜欢重新绑定变量。但是,这绝对是一个有效的习惯用法,它可以更安全。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JavaScript函数中的默认参数值

设置JavaScript函数的默认参数值

如何将类参数值的引用传递给同一类中的函数默认参数值

如何读取包含默认参数值的函数签名?

如何使用可选参数返回函数值?

如何使用libclang检索函数调用参数值

如何告诉PHP在函数调用中使用默认参数?

如何使用JavaScript函数设置href参数值

在Kotlin中访问函数的默认参数值

函数可以是默认参数值吗?

如何告诉RStudio使用包名称自动完成函数的参数?

使用反射调用具有默认参数值的函数

JS:默认函数参数值和范围

如何告诉VSCode函数参数的类型(JavaScript)

如何在Vue.js方法函数中设置默认参数值?

如何在Python中使用传递的参数作为默认参数值?

如何冻结可变的默认参数值?

没有反序列化的相应值时,如何使用构造函数的默认参数值?

在Kotlin中,是否继承了抽象函数的默认参数值?

如何告诉Swift在默认的可选参数之间使用哪个函数签名

对具有默认参数值的函数使用通配符模式会引发编译器254错误

如何使用小书签从HTML页面获取函数参数值?

具有默认参数值的方解石函数

如何使用多组参数值测试相同的函数?

JavaScript 函数默认参数值

PhpStorm:使用按键填充默认参数值

检查和修改函数默认参数值

如何使用默认参数调用函数?

如何告诉 AVERAGE 函数避免使用非数值