【问题标题】:Python reference for hasattr() choices to identify types用于识别类型的 hasattr() 选项的 Python 参考
【发布时间】:2012-09-10 23:14:14
【问题描述】:

是否有一个很好的一站式 Python 参考来选择属性以与 hasattr() 一起使用来识别类型。

例如,下面是一个不是字符串的序列:

def is_sequence(arg):
    return (not hasattr(arg, "strip") and
            hasattr(arg, "__getitem__") or
            hasattr(arg, "__iter__")) 

如果有一个可靠的参考来快速选择最佳模式,那就太好了。

【问题讨论】:

    标签: python reference hasattr


    【解决方案1】:

    使用已经在collections module(Python 3.3 中为collections.abc)中为您编写的virtual subclasses

    要检查某个东西是否是非字符串序列,请使用

    from collections import Sequence    # collections.abc in Python 3.3
    isinstance(arg, Sequence) and not isinstance(arg, basestring)    # str in Python 3
    

    【讨论】:

    • 我经常使用 isinstance,但我继续读到使用 hasattr 更加“Pythonic”,这样我们就不会不必要地排除具有正确方法并且可以正常工作的对象。
    • @majgis -- 真的,你可以只用try 来使用这个对象,如果你得到一个AttributeError,显然它不起作用。您可以使用hasattr 检查对象是否具有您将要使用的所有属性,但是,isinstance 存在于您想要确保自己正在工作的极少数情况下有一个清单,而不是别的东西。如果您需要特定类型,请不要害怕使用isinstance。但是,您通常需要特定类型,并且由于try/except,您很少需要提前检查
    • @majgis 建议早于虚拟子类的存在。请注意,大多数 Pythonic 代码仍然倾向于使用try/except
    【解决方案2】:

    使用适当的abstract base class:

    import collections
    isinstance([], collections.Sequence) # ==> true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 2012-09-16
      • 2015-11-25
      相关资源
      最近更新 更多