У нас есть функция, которая принимает множество различных типов ввода: функцию, строку, скомпилированное регулярное выражение, Hamcrest Matcher и фильтрует список соответствующим образом на основе типа ввода.isinstance без импорта кандидатов
В настоящее время мы используем isinstance(our_filter, hamcrest.matcher.Matcher)
, но для этого требуется, чтобы мы установили Hamcrest.
Мы рассматриваем использование совпадений строк на inspect.getmro(type(POSSIBLE_MATCHER))
; но это кажется нечистым. Могут также быть варианты с try
/except
вокруг оператора импорта.
Каков наилучший подход?
С помощью @dblslash, это лучшее, что я получил до сих пор:
[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']
У меня была аналогичная проблема, и я закончил с использованием 'if str (data .__ class__) == ':' .... Я бы не использовал try/catch, потому что он требует импорта модуля при первом использовании, которое в некоторых случаях может вызвать раздражающую задержку и, конечно же, занимает память, если вы, наконец, обнаружите, что вам действительно не нужен импортированный модуль, потому что входной сигнал был другого типа. –