【问题标题】:What is the canonical way of checking if two objects are of one specific class检查两个对象是否属于一个特定类的规范方法是什么
【发布时间】:2019-10-07 23:50:54
【问题描述】:

有没有一种pythonic方法来检查两个对象是否属于一种特定类型?我想这更多的是学术兴趣,而不是实际的代码必要性。

显然使用两个isinstance() 会起作用,三重方程也可以解决问题,但我想知道是否有一个可以工作并且也是pythonic 的单行器。

if type(obj1) == type(obj2) == MyClass:
    #DoSomething

因为这相当于

if (type(obj1) == type(obj2)) and (type(obj2) == MyClass):
    #DoSomething

左侧检查将引发 PEP8 警告以使用 isinstance()

【问题讨论】:

    标签: python types comparison-operators isinstance


    【解决方案1】:

    如果您愿意,您可以这样做,这可能有用随着对象数量的增加免责声明:2 个对象不值得,4+ 个对象可能值得):

    >>> a = [1,2]
    >>> b = [1,2]
    >>> all(map(lambda x: isinstance(x, list), [a,b]))
    True
    

    文档:allmaplambda

    【讨论】:

    • 这真的比使用and更好吗?
    • @Julien 不,但是随着您要检查的对象数量的增加:是的。如果你想检查 15 个对象,我宁愿看到这个而不是看到 15 and
    【解决方案2】:

    这取决于您是否要将两个对象视为同一类,如果一个对象是您要查找的类的子类的实例。

    例如,如果您有one = classA()two = classB(),其中classBclassA 的子类。你的第一种方法,你有:

    type(one) == type(two) == classA
    

    将评估为False。但是像这样使用isInstance

    isInstance(one, classA) and isInstance(two, classA)
    

    将评估为True

    PEP8 的目的是警告你一个非常普遍的问题,Python 人员决定需要警告程序员。通过isInstance 比较类几乎总是更有用,以至于如果解释器看到type(one) == type(two),它会假设你不打算做不寻常的事情,你打算做更普遍有用的事情isInstance比较,但是你做错了。

    长话短说,您很可能想要使用isInstance,但在不了解您的情况的情况下,我不能绝对肯定您不想使用type

    【讨论】:

    • 在我的具体情况下,我实际上没有什么区别,因为该类没有子类。令我惊讶的是 PEP8 警告,因为虽然我绝对同意 isinstance 应该在大多数情况下使用,但我可以看到您希望确保对象属于特定类而不是其子类之一的情况。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2020-06-15
    • 2013-09-28
    • 1970-01-01
    • 2013-07-12
    • 2023-04-09
    相关资源
    最近更新 更多