我正在编写一个模块,并使用
有时候(似乎几乎是随机的),像下面这样没有明确返回值的函数,在使用
以下是一个此类函数的示例:
所以
我对Python内部的工作原理不够了解,无法理解这里发生了什么。我希望避免由于忽略
我的函数(但只有一些,而且不是所有时?)必须返回(占用内存的)闭包或毫无意义的lambda表达式以避免这种情况吗?或者我应该创建一个检测测试是否进行并且然后仅返回no-op lambda的东西?这似乎是为了避免
unittest
来编写与实际代码一起的单元测试。有时候(似乎几乎是随机的),像下面这样没有明确返回值的函数,在使用
self.assertRaises(mymodule.MyEmptyException, myfunc())
(其中self
指的是unittest.TestCase
的子类)进行断言时会引发神秘的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
对应的单元测试:
def test_insertn_fail(self):
"""expect failure during multiple insertion"""
self.assertRaises(mouse16.BadInternalCallException,
stack.insertn([8, 4, 12], 16))
with self.assertRaises(TypeError):
stack.insertn(8, 16)
提供(例如):
./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内部的工作原理不够了解,无法理解这里发生了什么。我希望避免由于忽略
DeprecationWarning
而导致测试在未来出现无法修复的故障。我的函数(但只有一些,而且不是所有时?)必须返回(占用内存的)闭包或毫无意义的lambda表达式以避免这种情况吗?或者我应该创建一个检测测试是否进行并且然后仅返回no-op lambda的东西?这似乎是为了避免
DeprecationWarning
而做很多工作。
assertEqual()
,但是你提供的 traceback 使用了assertRaises()
上下文管理器。 - Martijn Pieters