2013-06-06 37 views
7

Chúng tôi có một chức năng mà có nhiều loại đầu vào khác nhau: một hàm, chuỗi, biểu thức chính quy được biên dịch, Hamcrest Matcher và lọc danh sách phù hợp dựa trên loại đầu vào.isinstance mà không cần nhập khẩu ứng cử viên

Hiện tại chúng tôi đang sử dụng isinstance(our_filter, hamcrest.matcher.Matcher), nhưng điều này yêu cầu chúng tôi yêu cầu Hamcrest phải được cài đặt.

Chúng tôi đang xem xét sử dụng các đối sánh chuỗi trên inspect.getmro(type(POSSIBLE_MATCHER)); nhưng điều này cảm thấy ô uế. Cũng có thể có các tùy chọn với try/except xung quanh câu lệnh nhập.

Cách tiếp cận tốt nhất là gì?


Với sự giúp đỡ từ @dblslash, đây là tốt nhất mà tôi đã có cho đến nay:

[x.__module__+"."+x.__name__ for x in inspect.getmro(type(POSSIBLE_MATCHER))] ['hamcrest.core.core.isequal.IsEqual', 'hamcrest.core.base_matcher.BaseMatcher', 'hamcrest.core.matcher.Matcher', 'hamcrest.core.selfdescribing.SelfDescribing', '__builtin__.object']

+0

Tôi có vấn đề tương tự và kết thúc bằng cách sử dụng 'if str (dữ liệu .__ class__) == ':' .... Tôi sẽ không sử dụng try/catch vì nó yêu cầu nhập mô-đun ở lần sử dụng đầu tiên, có thể trong một số trường hợp gây chậm trễ gây phiền nhiễu và tất nhiên sẽ mất bộ nhớ nếu bạn cuối cùng thấy rằng bạn thực sự không cần mô-đun đã nhập vì đầu vào có loại khác nhau. –

Trả lời

8

Sử dụng type(POSSIBLE_MATCHER).__name__ là IMHO một giải pháp khá thanh lịch cho loại kiểm tra mà không cần phải để nhập mô-đun.

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