这个贬抑警告(“callable is None”)是什么意思?

2024-10-01 09:42:30 发布

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

我正在编写一个模块,并使用unittest在实际代码的同时编写单元测试。在

有时(似乎几乎是不确定的),像下面这样的函数不显式地返回一个用self.assertRaises(mymodule.MyEmptyException, myfunc())断言的值(其中self是{}的子类)会引发一个神秘的DeprecationWarning。在

下面是这样一个函数的示例:

def insertn(self, items, lidex):
    """( z y x -- z b y x )
    add a list of items to the stack at the given index"""
    iter(items)
    for idx, obj in enumerate(items):
        self.insert(lidex, obj)
        lidex += 1

相应的单元测试:

^{pr2}$

给出(例如):

./mousetesting.py:103: DeprecationWarning: callable is None

我认为使函数具有非None返回值可能会解决问题(即return 0),但是我得到了(例如):

======================================================================
ERROR: test_insertn_fail (__main__.CoreStack)
expect failure during multiple insertion
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./mousetesting.py", line 103, in test_insertn_fail
    stack.insertn([8, 4, 12], 16))
  File "/usr/lib/python3.5/unittest/case.py", line 727, in assertRaises
    return context.handle('assertRaises', args, kwargs)
  File "/usr/lib/python3.5/unittest/case.py", line 176, in handle
    callable_obj(*args, **kwargs)
TypeError: 'int' object is not callable

----------------------------------------------------------------------

所以unittest模块试图调用函数的返回值。。。但不抱怨None不是callable?在

我对Python内部的了解还不够,不足以理解这里发生了什么。我不知道怎样才能避免我的测试中断。在

必须是我的职能(但只是其中的一部分,而不是所有的时间?)返回一个(内存浪费)闭包或无意义的lambda表达式来避免这种情况?或者我应该设计一个东西来检测一个测试是否正在进行,然后才返回一个no-op lambda?为了避免出现DeprecationWarning,这似乎需要做很多工作。在


Tags: 函数inpyselfnoneobjlineitems
1条回答
网友
1楼 · 发布于 2024-10-01 09:42:30

您使用self.assertRaises()不正确。它必须为您调用测试函数,以便捕捉异常:

self.assertRaises(mouse16.BadInternalCallException,
    stack.insertn, [8, 4, 12], 16)

您正在传递stack.insertn()调用的结果(它没有引发异常,而是返回了None或整数),并且该返回值不可调用。该方法的旧版本也接受了该参数的None,但不再受支持,因此当传入None而不是整数时,会发出弃用警告。在

更好的方法是使用self.assertRaises()作为上下文管理器:

^{pr2}$

相关问题 更多 >