2013-06-06 3 views
7

У нас есть функция, которая принимает множество различных типов ввода: функцию, строку, скомпилированное регулярное выражение, 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']

+0

У меня была аналогичная проблема, и я закончил с использованием 'if str (data .__ class__) == ':' .... Я бы не использовал try/catch, потому что он требует импорта модуля при первом использовании, которое в некоторых случаях может вызвать раздражающую задержку и, конечно же, занимает память, если вы, наконец, обнаружите, что вам действительно не нужен импортированный модуль, потому что входной сигнал был другого типа. –

ответ

8

Использование type(POSSIBLE_MATCHER).__name__ ИМХО довольно элегантное решение для проверки типа без для импорта модуля.