Синтаксис нечетного типа, используемый с isinstance()

#python

Вопрос:

Недавно мне было поручено перенести кучу существующих сценариев python 2.7 на python 3.x, и я заметил заявление в одном из сценариев, которое я не совсем понимаю:

 if isinstance(some_variable, (list,)):
   # ...
 

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

 >>> isinstance(([],123), (list,))
False
 

Посмотрев на вызывающий код, я обнаружил, что единственные значения аргументов, которые когда-либо передавались, some_variable были списками, поэтому я протестировал:

 >>> isinstance([], (list,))
True
 

Так почему бы вам использовать (list,) вместо просто list с isinstance() ?

Я подозреваю, что могут быть и другие (похожие на список?) типы , для которых isinstance() будет возвращен вызов True , но у меня нет необходимого опыта работы с python, чтобы подумать о том, что это может быть 🙂

Комментарии:

1. Похоже либо на автоматический вывод инструмента, либо на то, что кто-то копирует и изменяет код, не понимая его. Там нет причин использовать (list,) вместо list этого.

2. Вы нашли эту версию в python2 или python3 ?

3. @AbdulNiyasPM в python2, но, похоже, он ведет себя так же в python3

4. Это также может быть результатом редактирования кода, который использовался для проверки нескольких типов, и при редактировании просто сохранялся кортеж, чтобы разница была минимальной.

5. Из документов : «Верните True , если аргумент объекта является экземпляром аргумента classinfo, [ … ]. Если classinfo является кортежем объектов типа (или рекурсивно другими подобными кортежами), верните значение True, если объект является экземпляром любого из типов . Если classinfo не является типом или кортежем типов и таких кортежей, возникает исключение TypeError.»

Ответ №1:

isinstance может получить тип ИЛИ кортеж типов в качестве второго аргумента.

(list,) представляет собой кортеж только с 1 записью. В случае, если у вас есть только один тип для сравнения, вам не нужно использовать tuple

Комментарии:

1. Ах, в этом есть смысл, я только что заметил isinstance("", (list, str)) and isinstance([], (list, str)) , что это тоже работает.

Ответ №2:

Это (list,) кортеж с одним элементом и вот так list и для вашего примера :

 >>> isinstance(([],123), (list,))
False 

>>> isinstance(([],123), (tuple,))
True

>>> isinstance(([],123), tuple)
True
 

если вы хотите проверить isinstance , сделайте map как показано ниже:

 >>> list(map(lambda x : isinstance(x , (list,)), ([],123)))
[True, False]

>>> all(map(lambda x : isinstance(x , (list,)), ([],123)))
False

>>> any(map(lambda x : isinstance(x , (list,)), ([],123)))
True