当您希望传递的函数在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 不同意,我认为应该是ValueError
,type 是正确的,它是一个函数对象,但该函数对象的值不合适。
@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中具有特定参数时会引发啥异常[关闭]的主要内容,如果未能解决你的问题,请参考以下文章