2011-12-12 20 views
6

Tôi đang cố gắng để sử dụng khẳng định để hiển thị một số bất biến (chủ yếu là trong thử nghiệm) Vì vậy tôi muốn viết một cái gì đó như sau:khẳng định kiểm tra trong một lambda trong 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)) 

Nếu tôi sử dụng điều này với unittest .assertEqual này hoạt động hoàn toàn tốt, nhưng nếu tôi muốn viết điều này với một xác nhận nó chỉ thất bại. Có cách nào để sửa lỗi này?

Trả lời

8

Thật không may, assert là một tuyên bố và Pydon giới hạn lambdas không cho phép điều đó trong đó. Chúng cũng hạn chế những thứ như print.

Bạn có thể sử dụng biểu thức trình tạo ở đây.

assert all(x[0] == x[1] for x in zip([run_function(i) for i in values ], expected_values)) 

Cá nhân tôi nghĩ rằng những điều sau đây sẽ dễ đọc hơn

assert all(run_function(i) == j for i,j in zip(inputs, expected_values)) 
+0

Dưới đây là một số thứ khác bạn có thể làm để thực sự khẳng định: http://stackoverflow.com/a/40286356/78234 –

8

Từ documentation:

Lưu ý rằng chức năng tạo ra với hình thức lambda không thể chứa câu lệnh.

assert is a statement.

Vì vậy, không, bạn không thể sử dụng câu lệnh assert trong một biểu thức lambda.

+0

Trên thực tế bạn có thể - xem http://stackoverflow.com/a/40286356/ 78234 –

+0

Không, bạn không sử dụng câu lệnh 'assert'. Bạn đang đạt được một hiệu ứng tương tự bằng cách ném lỗi, nhưng điều đó không làm mất hiệu lực những gì tôi đã nói. –

+0

Tất nhiên tôi đang hack nó - bạn không thể sử dụng một tuyên bố, như bạn đã nói. –

2

Trên thực tế bạn có thể:

assertion_raiser = lambda: (_ for _ in()).throw(AssertionError("My Lambda CAN raise an assertion!")) 

Dưới đây là một số xác nhận:

try: 
    assertion_raiser() 
except AssertionError: 
    print("assertion caught") 
+1

Thú vị là nó trông không dễ đọc lắm. Tôi đoán tôi muốn bọc một khẳng định vào một chức năng hoặc viết chức năng khẳng định của riêng tôi cho phép tôi đặt nó trong một lambda. – Alex

Các vấn đề liên quan