在python中检查lambda中的断言
我试图使用断言来显示一些不变量(主要是在测试中) 因此,我想写以下内容:在python中检查lambda中的断言,python,Python,我试图使用断言来显示一些不变量(主要是在测试中) 因此,我想写以下内容: values = [ range(10) ] expected_values = [ range(10) ] map (lambda x: assert x[0] == x[1] ,zip( [ run_function(i) for i in values ], expected_values)) 如果我将它与unittest.assertEqual一起使用,它工作得非常好,但是如果我想用断言编写它,它就会失败。有
values = [ range(10) ]
expected_values = [ range(10) ]
map (lambda x: assert x[0] == x[1] ,zip( [ run_function(i) for i in values ], expected_values))
如果我将它与unittest.assertEqual一起使用,它工作得非常好,但是如果我想用断言编写它,它就会失败。有办法解决这个问题吗?从:
请注意,使用lambda表单创建的函数不能包含语句
因此,不能在lambda表达式中使用
assert
语句。不幸的是,assert
是一个语句,Pythons limited lambda不允许这样做。它们还限制诸如打印
之类的内容
但在这里可以使用生成器表达式
assert all(x[0] == x[1] for x in zip( [run_function(i) for i in values ], expected_values))
我个人认为以下内容更具可读性
assert all(run_function(i) == j for i,j in zip(inputs, expected_values))
实际上你可以:
assertion_raiser = lambda: (_ for _ in ()).throw(AssertionError("My Lambda CAN raise an assertion!"))
以下是一些验证:
try:
assertion_raiser()
except AssertionError:
print("assertion caught")
在我的应用程序中工作,类似于:
def\u lambda\u断言(fn,*args,**kwargs):
定义断言(fn输出):
如果isinstance(fn_out,(列表,元组)):
值,fail\u msg=fn\u out
断言值,失败\u消息
其他:
仅断言fn#u out#值
返回lambda:_断言(fn(*args,**kwargs))
#返回lambda x:_assert(fn(*args,**kwargs))35;用于pytest;需要虚拟位置
用法示例:
将numpy导入为np
def测试精度(尺寸,atol=1e-2):
x=np.random.randn(大小)
y=np.random.randn(大小)
absdiff=np.abs(x-y)
fail_msg=f“absdiff:{absdiff};atol={atol}”
返回np.allclose(x,y,atol=atol),fail\u msg
lambda\u assert=\u lambda\u assert(\u test\u precision,20,atol=1)
您还可以做一些事情来实际断言:不,您没有使用assert
语句。通过抛出错误,您也获得了类似的效果,但这并不能使我所说的无效。当然,我正在破解它-您不能使用语句,正如您所说。有趣的是,它看起来不是很可读。我想我更愿意将断言封装到函数中,或者编写自己的断言函数,允许我将其放入lambda中。但这会使erros消息更难处理吗?当您在assert之前计算表达式时,这只是一个最小的示例;所示的关键是通过本地函数定义将断言有效地包装在可调用中-如何派生value
和fail\u msg
非常灵活。例如,我实际上从另一个函数中获取了这两个函数:value,fail\u msg=\u fn()
,其中\u fn()
任意复杂。这是我为数不多的几件事中的一件,我必须手工破解PyTest的各种需求。@Alex承认我的例子不是很清楚-更新的答案