2010-09-07 36 views
18

Có cách nào để kiểm tra xem biến có giữ lambda không? Bối cảnh là tôi muốn kiểm tra một loại trong một thử nghiệm đơn vị:Làm cách nào để kiểm tra xem biến có chứa lambda không?

self.assertEquals(lambda, type(myVar)) 

Các type có vẻ là "chức năng", nhưng tôi không thấy bất kỳ loại BUILTIN rõ ràng để phù hợp với nó. Rõ ràng, tôi có thể viết những dòng này, nhưng nó cảm thấy vụng về:

self.assertEquals(type(lambda m: m), type(myVar)) 
+0

Không đặt câu hỏi là "wiki cộng đồng". –

+3

Tôi không đăng câu trả lời cho câu hỏi "wiki" như một quy tắc (quá nhiều cơn đau đầu), nhưng câu trả lời ngắn gọn là: không. Lambda không phải là một loại trong Python, nó chỉ là viết tắt để khai báo một hàm. Việc phân biệt giữa chúng là vô nghĩa; không có sự khác biệt. –

Trả lời

13
def isalambda(v): 
    LAMBDA = lambda:0 
    return isinstance(v, type(LAMBDA)) and v.__name__ == LAMBDA.__name__ 
+0

Cảm ơn, tôi sẽ đi cho điều đó. Chỉ cần kiểm tra các loại như tôi đã làm là không lý tưởng vì bất kỳ chức năng sẽ phù hợp để kiểm tra ___name___ hoặc func_name là một kết hợp tốt trên đó. Dunno có khả năng là tên lambda bên trong sẽ thay đổi sau đó. Nó vẫn còn khá vụng về :-) – ralfoide

+0

@ralfoids, đồng ý về vụng về, nhưng sau đó Python 'lambda' s _are_ hoàn toàn vụng về tất cả các cách ;-) BTW, sự khác biệt nào nó làm cho bạn cho dù một var là 'def''d hoặc hàm lambda'? –

+2

@ralfoide, Bạn có thể sử dụng 'v .__ name __ == (lambda: None) .__ name__' nếu bạn lo lắng về tên của' lambda' thay đổi –

1
mylambda.func_name == '<lambda>' 
+0

Đó không phải là một chút mong manh? – ralfoide

+0

Vâng, đây không phải là điều được chỉ định bởi ngôn ngữ và nó có thể phá vỡ bất cứ lúc nào. Đừng làm thế. –

9

Sử dụng typesmodule:

from types import * 

assert isinstance(lambda m: m, LambdaType) 

Theo các tài liệu, Nó là an toàn để sử dụng from types import *.

+0

Ngược lại với câu trả lời được chấp nhận, nó cũng hoạt động nếu '__name__' của lambda chức năng được thay đổi. – sevenforce

+6

Điều này sai: types.LambdaType * là * types.FunctionType. Điều đó có nghĩa rằng điều này sẽ phù hợp với Lambdas và chức năng như nhau – polvoazul

+1

Vì không có sự khác biệt thực tế, điều này có lẽ là câu trả lời tốt nhất. –

13

Đây là năm quá hạn, nhưng callable(mylambda) sẽ trả về True cho bất kỳ hàm hoặc phương thức có thể gọi nào, bao gồm lambdas. hasattr(mylambda, '__call__') thực hiện điều tương tự nhưng kém thanh lịch hơn nhiều.

Nếu bạn cần biết điều gì đó là hoàn toàn độc quyền một lambda, thì mylambda.__name__ == "<lambda>" là những gì tôi muốn sử dụng.

(Câu trả lời này có liên quan đến Python2.7.5.)

+1

Đối với những gì nó có giá trị, tôi muốn đề nghị thay đổi 'hasattr (mylambda, '__call __')' tham chiếu với 'có thể gọi (mylambda)' - nó làm điều tương tự dưới mui xe, nhưng nó là một tính năng tích hợp cho Python 2, được ghi lại tại https://docs.python.org/2/library/functions.html#callable. – DreadPirateShawn

+0

Tôi thậm chí không biết về điều đó-- Tôi không ngạc nhiên khi có một thứ như vậy, nhưng tôi hơi bối rối khi tôi không tìm thấy nó khi tôi đang tìm kiếm điều này lên vài tháng trước ... Cool. – Augusta

4

Không cần phải làm bất cứ hacks, được xây dựng trong inspect mô-đun xử lý nó cho bạn.

import inspect 
print inspect.isfunction(lambda x:x) 
Các vấn đề liên quan