在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承认我的例子不是很清楚-更新的答案