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']
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. –