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

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

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

如果我不将math.isclosertol传递给atol,则上述操作在 foo 中失败:

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):
        ...
    ...

这看起来很长很傻,并且在每次调用时分配dictfoo(它以递归方式调用自己,所以这很重要)。

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

PS。有几个相关的问题。请注意,我不想知道 math.isclose 的实际默认参数-我只想告诉它使用默认值即可。

参考方案

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

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)
    ...

警告:

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

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

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

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:无符号32位按位算术 - python

试图回答另一篇有关其解决方案涉及IP地址和网络掩码的文章时,我陷入了普通的按位算法。在Python中,是否存在一种标准的方式来进行按位AND,OR,XOR,NOT运算,假设输入是“32位”(可能是负数)整数或long,并且结果必须是[[ 0,2 ** 32]?换句话说,我需要一个与无符号长整数之间的C按位运算有效的Python对应物。编辑:具体问题是这样的:…

Python:图像处理可产生皱纹纸效果 - python

也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…