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