2013-06-06 12 views
7

Çok çeşitli giriş türlerini kullanan bir fonksiyona sahibiz: bir fonksiyon, bir dize, derlenmiş bir düzenli ifade, bir Hamcrest Matcher ve bir girişin türüne göre uygun bir listeyi filtreler.Adayı içe aktarmadan isinstance

Şu anda isinstance(our_filter, hamcrest.matcher.Matcher) kullanıyoruz, ancak bu Hamcrest'in yüklenmesini gerektiriyor.

inspect.getmro(type(POSSIBLE_MATCHER)); ama bu kirli hissettiriyor. Ayrıca, içe aktarma ifadesinin etrafında try/except seçenekleriyle birlikte olabilir.

En iyi yaklaşım nedir?

[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

Benzer bir sorunla karşılaştım ve 'str (data .__ class__) == ':' i kullanarak kullanmayı bitirdim. ilk kullanımda, bazı durumlarda sinir bozucu gecikmeye neden olabilir ve tabii ki sonunda içe aktarma modülüne ihtiyacınız olmadığına karar verdiyseniz, bu durumda giriş farklı türdeydi. –

cevap

8

type(POSSIBLE_MATCHER).__name__ IMHO kalmadan tür denetleme için oldukça şık bir çözüm kullanarak: @dblslash yardımıyla


, bu şimdiye kadar var en iyisidir modülü almak için