Почему для isinstance требуется кортеж, а не итерация?

В следующем фрагменте:

In [1]: x = [0]

In [2]: isinstance(x, list)
Out[2]: True

In [3]: isinstance(x, (list, set))
Out[3]: True

In [4]: isinstance(x, [list, set])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-95dd12d6777a> in <module>()
----> 1 isinstance(x, [list, set])

TypeError: isinstance() arg 2 must be a type or tuple of types

Почему isinstance в [4] настаивает на том, чтобы второй аргумент был кортежем, а не просто итерируемым (например, list или set)? Странное дизайнерское решение.


person pzelasko    schedule 11.12.2018    source источник
comment
Вот, возможно, подходящий ответ: stackoverflow.com/a/45118023/6419007   -  person Eric Duminil    schedule 11.12.2018
comment
Я решил закрыть как дубликат, так как это в основном тот же вопрос и тот же ответ, только в отношении другой встроенной функции. Если вы не согласны, не стесняйтесь голосовать за возобновление работы.   -  person DeepSpace    schedule 11.12.2018
comment
Кстати, isinstance работает рекурсивно, поэтому isinstance(1, (list, (tuple, int))) вернет True.   -  person DeepSpace    schedule 11.12.2018
comment
@DeepSpace: Насколько мне известно, дубликаты используются для повторяющихся вопросов, а не для связанных вопросов, на которые может быть один и тот же ответ.   -  person Eric Duminil    schedule 11.12.2018
comment
@Eric В этом случае я думаю, что вопросы достаточно близки (название сильно отличается, но тело вопроса в основном имеет тот же вопрос), и ответ там настолько обширен и хорош, что применим здесь на 100%.   -  person deceze♦    schedule 11.12.2018
comment
Я закрыл это, так как нам не нужен отдельный вопрос о том, почему каждая встроенная функция, которая поддерживает только кортежи, а не любая итерация, имеет это требование.   -  person jpp    schedule 11.12.2018
comment
Я также проголосовал за этот вопрос, так как это хороший дублирующийся маркер.   -  person jpp    schedule 11.12.2018
comment
Ответ для startwith() использует обоснование того, что строки являются итерируемыми. Это неприменимо к isinstance(), где второй аргумент никогда не может быть строкой.   -  person Marius Gedminas    schedule 18.12.2018