Каков канонический способ проверки, принадлежат ли два объекта одному определенному классу? - PullRequest
0 голосов
/ 08 октября 2019

Есть ли питонный способ проверить, относятся ли два объекта к одному определенному типу? Я полагаю, что это больше академический интерес, чем фактическая необходимость кода.

Очевидно, что использование двух isinstance() сработает, и тройное уравнение тоже сработает, но мне было интересно, есть ли одна строка, котораябудет работать и будет питонным.

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

, поскольку это эквивалентно

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

левая проверка вызовет предупреждение PEP8 для использования isinstance()

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Это зависит от того, хотите ли вы считать два объекта одного и того же класса, если один является экземпляром подкласса класса, который вы ищете.

Например, если у вас есть one = classA() и two = classB(), где classB - это подкласс classA. Ваш первый подход, где у вас было:

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.

0 голосов
/ 08 октября 2019

Вы можете сделать это, если хотите, что может быть полезно , так как число объектов увеличивается в размере ( отказ от ответственности: не стоит для 2 объектов, вероятно, стоит для 4+ объектов ):

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

Документы: все , карта , лямбда

...