2013-06-06 10 views
7

Mamy funkcję, która pobiera różne rodzaje danych wejściowych: funkcja, ciąg, skompilowane wyrażenie regularne, Hamcrest Matcher i filtruje listę odpowiednio na podstawie typu danych wejściowych.isinstance bez importowania kandydatów

Obecnie używamy isinstance(our_filter, hamcrest.matcher.Matcher), ale wymaga to od nas wymagać zainstalowania Hamcrest.

Rozważamy użycie dopasowań ciągów na inspect.getmro(type(POSSIBLE_MATCHER)); ale to wydaje się nieczyste. Mogą być również dostępne opcje z try/except wokół instrukcji import.

Jakie jest najlepsze podejście?


Z pomocą @dblslash, jest to najlepszy mam tak daleko:

[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

Miałem podobny problem i skończyło się na użyciu 'if str (data .__ class__) == ':' .... Nie użyłbym try/catch, ponieważ wymaga on importu modułu przy pierwszym użyciu, które w niektórych przypadkach może wywołać irytujące opóźnienie i oczywiście zabiera pamięć, jeśli w końcu okaże się, że nie potrzebujesz importowanego modułu, ponieważ dane wejściowe były innego typu. –

Odpowiedz

8

Korzystanie type(POSSIBLE_MATCHER).__name__ jest IMHO dość eleganckie rozwiązanie dla typu kontroli, bez konieczności zaimportować moduł.

Powiązane problemy