2013-06-06 21 views
7

Wir haben eine Funktion, die eine Vielzahl von verschiedenen Eingabearten akzeptiert: eine Funktion, eine Zeichenfolge, einen kompilierten regulären Ausdruck, eine Hamcrest Matcher und filtert eine Liste entsprechend dem Typ der Eingabe.isinstance ohne Importkandidaten

Wir verwenden derzeit isinstance(our_filter, hamcrest.matcher.Matcher), aber dies erfordert, dass wir Hamcrest installieren müssen.

Wir erwägen die Verwendung von Zeichenfolgenübereinstimmungen unter inspect.getmro(type(POSSIBLE_MATCHER)); aber das fühlt sich unrein an. Möglicherweise gibt es auch Optionen mit try/except um die Import-Anweisung.

Was ist der beste Ansatz?


Mit Hilfe von @dblslash, das ist das Beste, was ich bisher habe:

[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

Ich hatte ähnliches Problem und endete mit der Verwendung von 'if str (Daten .__ class__) == ':' .... Ich würde try/catch nicht verwenden, da es das Modul importieren erfordert Bei der ersten Verwendung, die in einigen Fällen lästige Verzögerung verursachen kann und natürlich Speicher beansprucht, wenn Sie schließlich feststellen, dass Sie das importierte Modul tatsächlich nicht benötigen, da die Eingabe von anderer Art war. –

Antwort

8

Mit type(POSSIBLE_MATCHER).__name__ ist IMHO eine recht elegante Lösung für die Typprüfung ohne um das Modul zu importieren.