我们有一个函数,它接受各种不同类型的输入:函数,字符串,编译的正则表达式,Hamcrest Matcher,并根据输入的类型适当地过滤列表。
我们目前正在使用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']
答案 0 :(得分:13)
使用type(POSSIBLE_MATCHER).__name__
是恕我直言,这是一种相当优雅的类型检查解决方案,无需导入模块。
答案 1 :(得分:1)
如果您想迎合继承,使用type(POSSIBLE_MATCHER).__name__
不会削减继承。然后,您可以检查继承链中的所有类型:
class_string in [t.__name__ for t in type(POSSIBLE_MATCHER).__mro__]