#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