Python проверяет, существует ли какой-либо тип в списке?

Как я питонически делаю:

var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or  isinstance(var, classinfoN)

Кажется глупым, я не могу просто перейти в список classinfo:

var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )

Итак, какова isinstanceofany функция?

Ответы

Ответ 1

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

isinstance(var, (classinfo1, classinfo2, classinfo3))

Другими словами, isinstance() уже предлагает эту функциональность, из коробки.

Из документации isinstance():

Если classinfo не является объектом класса или объектом типа, он может быть кортежем объектов класса или типа или может содержать рекурсивно другие подобные кортежи (другие типы последовательностей не принимаются).

Акцент мой; обратите внимание на рекурсивный характер; (classinfo1, (classinfo2, classinfo3)) также является допустимым вариантом.

Ответ 2

Вы уже довольно близко относились к названию своего вопроса. Вы можете использовать any и список:

var = 7.0
var_is_good = any([isinstance(var, classinfo1),
                   isinstance(var, classinfo2),
                   isinstance(var, classinfo3), ...
                   isinstance(var, classinfoN)])

Но в документах isinstance раскрывается:

Возвращает true, если аргумент object является экземпляром аргумента classinfo или его (прямого, косвенного или виртуального) подкласса. Если объект не является объектом данного типа, функция всегда возвращает false. Если classinfo не является классом (тип объекта), он может быть кортежем объектов типа или может содержать рекурсивно другие такие кортежи (другие типы последовательностей не принимаются). Если classinfo не является типом или кортежем типов и таких кортежей, возникает исключение TypeError.

Это означает, что лучший способ сделать это

var = 7.0
var_is_good = isinstance(var, (classinfo1,
                               classinfo2,
                               classinfo3,
                               ...,
                               classinfoN))

Ответ 3

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

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])

Ответ 4

Это решит вашу проблему:

valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)

На основе документации есть много способов передать значения типов в isinstance.

Вы также можете посмотреть на сладострастный, если вы пытаетесь сделать более сложную проверку, из которой это всего лишь часть.