21

我们有一个函数,它接受各种不同类型的输入:一个函数、一个字符串、一个编译的正则表达式、一个Hamcrest 匹配器,并根据输入的类型适当地过滤一个列表。

我们目前正在使用isinstance(our_filter, hamcrest.matcher.Matcher),但这需要我们安装 Hamcrest。

我们正在考虑在inspect.getmro(type(POSSIBLE_MATCHER));上使用字符串匹配。但这感觉不干净。在 import 语句周围可能还有带有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']

4

3 回答 3

25

恕我直言,使用type(POSSIBLE_MATCHER).__name__是一种相当优雅的类型检查解决方案,无需导入模块。

于 2013-06-06T14:19:29.677 回答
5

如果你想迎合继承,使用type(POSSIBLE_MATCHER).__name__不会削减它。然后,您可以检查继承链中的所有类型:

class_string in [t.__name__ for t in type(POSSIBLE_MATCHER).__mro__]
于 2020-08-10T09:17:44.420 回答
0

尽管这是一个很老的问题,但我想我会为此分享我的解决方案:

  • 使用条件导入并设置一个标志来检查之前导入是否成功isinstance()!(毕竟如果模块不能被导入isinstance应该总是返回False

例如这样的:

try:
    import somemodule

    _import_OK = True
except ImportError:
    _import_OK = False


# and then later in the code:
if _import_OK:
    q = isinstance(x, somemodule.something)
else
    q = False
于 2022-01-23T00:38:23.853 回答