isinstance 不导入候选人
Posted
技术标签:
【中文标题】isinstance 不导入候选人【英文标题】:isinstance without importing candidates 【发布时间】:2013-06-02 14:26:30 【问题描述】:我们有一个函数,它接受各种不同类型的输入:函数、字符串、编译的正则表达式、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']
【问题讨论】:
我遇到了类似的问题,最终使用了if str(data.__class__) == '<class 'somemodule.someclass'>:
...。我不会使用 try/catch,因为它需要在第一次使用时导入模块,这在某些情况下会导致烦人的延迟如果您最终发现实际上不需要导入的模块,当然会占用内存,因为输入的类型不同。
【参考方案1】:
如果你想迎合继承,使用type(POSSIBLE_MATCHER).__name__
不会削减它。然后您可以检查继承链中的所有类型:
class_string in [t.__name__ for t in type(POSSIBLE_MATCHER).__mro__]
【讨论】:
【参考方案2】:恕我直言,使用type(POSSIBLE_MATCHER).__name__
是一种相当优雅的类型检查解决方案,无需导入模块。
【讨论】:
以上是关于isinstance 不导入候选人的主要内容,如果未能解决你的问题,请参考以下文章