当您希望传递的函数在python中具有特定参数时会引发啥异常[关闭]

Posted

技术标签:

【中文标题】当您希望传递的函数在python中具有特定参数时会引发啥异常[关闭]【英文标题】:What exception to raise when you want a passed function to have a particular argument in python [closed]当您希望传递的函数在python中具有特定参数时会引发什么异常[关闭] 【发布时间】:2021-10-24 05:37:17 【问题描述】:

我有一个接受另一个函数的高阶函数,我需要确保传递的函数至少接受 2 个参数,并且其中一个参数的名称是 'n'。 所以我写了下面的代码:

import inspect

def higher_order_function(passed_function):
    parameters = inspect.signature(passed_function).parameters
    if len(parameters) < 2:
        raise ValueError("passed_function should accept at least 2 arguments")
    if 'n' not in parameters:
        raise ValueError("passed_function should accept an argument named 'n'")

我不确定我是否针对这两种情况提出了正确的异常类型。

【问题讨论】:

TypeError 可能更合适。 def bad_fctn(): n, foo = 1, 2 会通过但不接受任何参数。 @khelwood 不同意,我认为应该是ValueErrortype 是正确的,它是一个函数对象,但该函数对象的值不合适。 @juanpa.arrivillaga - 但是如果您使用错误数量的参数或不存在的关键字进行调用,则会出现 TypeError。好像这是一个类似的案例。 要详细说明@tdelaney 点,你不能在这里使用co_varnames,它只会给你本地名称。如果您想检查签名...使用inspect.signature,例如sig = inspect.signature(passed_func) 那你可以看看sig.parameters 【参考方案1】:

我推荐这个:

import inspect

def higher_order_function(passed_function):
    parameters = inspect.signature(passed_function).parameters
    if len(parameters) < 2:
        raise TypeError("passed_function should accept at least 2 arguments")
    if 'n' not in parameters:
        raise ValueError("passed_function should accept an argument named 'n'")

运行的第一个测试是参数数量。如果确定传递了正确数量的参数,则您确定 passed_function 是正确的类型,即 Callable 且 >= 2参数。

然后运行第二个测试,如果未找到名为 n 的参数,则应该 raise a ValueError,因为您现在正在检查该参数对象的 类型正确。

这通常也是我测试的方式:先输入,然后是值,等等。

FWIW 我认为您应该首先测试传递给higher_order_function() 的参数确实是Callable,然后再使用inspect

【讨论】:

以上是关于当您希望传递的函数在python中具有特定参数时会引发啥异常[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中传递参数化函数句柄

将数组传递给 TypeScript 中的可变参数函数

在 C 中通过引用传递时会发生啥?

python_函数的参数

Python函数的参数

xtensor 将 numpy 数组传递给具有 xt::xtensor 参数类型的函数