Python проверить, если isinstance любой тип в списке?

как я могу сделать pythonicly:

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] )

Так что

4 ответов


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

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

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

С isinstance() документация:

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

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


вы были довольно близки с названием вашего вопроса уже. Вы могли бы использовать 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 не является классом (type object), это может быть набор объектов типа, или может рекурсивно содержать другие такие кортежи (другие типы последовательностей не принимаются). Если classinfo не является типом или кортежем типов и таких кортежей, возникает исключение TypeError.

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

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

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

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

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

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

на основе документация существует множество способов передачи значений типов в isinstance.

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