Как сравнить тип объекта в Python?

Еще в 1980-х годах ObjectStore обеспечивал прозрачный доступ к объектам. Это было похоже на RDBMS плюс ORM, за исключением всех лишних негерметичных уровней абстракции: он хранил объекты непосредственно в базе данных.

Таким образом, эта альтернатива была действительно «ни одного языка вообще», или, возможно, язык, который вы уже используете ». Вы должны писать код C ++ и создавать или перемещать объекты, как если бы они были родными объектами, и база данных позаботилась обо всем по мере необходимости. Вроде как ActiveRecord, но он действительно работал так же, как заявка на маркетинг Blitzes от ActiveRecord. : -)

(Конечно, у него не было маркетинговой мышцы Oracle, и у него не было нулевой стоимости MySQL, поэтому все игнорировали его. И теперь мы пытаемся реплицировать это с помощью РСУБД и ОРМ , и некоторые люди пытаются утверждать, что таблицы действительно имеют смысл для хранения объектов, и что писать гигантский XML-файл, чтобы сообщить компьютеру, как сопоставлять объекты с таблицами, является каким-то разумным решением.)

146
задан Fermi paradox 11 September 2015 в 12:09
поделиться

9 ответов

isinstance()

В Вашем случае, isinstance("this is a string", str) возвратится True.

Можно также хотеть считать это: http://www.canonical.org/~kragen/isinstance/

222
ответ дан 23 November 2019 в 22:09
поделиться

я думаю, что это должно сделать это

if isinstance(obj, str)
2
ответ дан 23 November 2019 в 22:09
поделиться

Я использую type(x) == type(y)

Например, если я хочу проверить, что что-то - массив:

type( x ) == type( [] )

строковая проверка:

type( x ) == type( '' ) or type( x ) == type( u'' )

Если Вы хотите не проверить ни по Одному, использование

x is None
4
ответ дан 23 November 2019 в 22:09
поделиться

Вы очень близки! string модуль, не тип. Вы, вероятно, хотите сравнить тип obj против текстового объекта для строк, а именно, str:

type(obj) == str  # this works because str is already a type

Кроме того:

type(obj) == type('')

Отметьте, в Python 2, если obj тип unicode, затем ни одно из вышеупомянутого не будет работать. Ни будет isinstance(). См. комментарии John's к этому сообщению для того, как обойти это... Я пытался помнить это в течение приблизительно 10 минут теперь, но имел блок памяти!

6
ответ дан 23 November 2019 в 22:09
поделиться

Можно всегда использовать type(x) == type(y) прием, где y что-то с известным типом.

# check if x is a regular string
type(x) == type('')
# check if x is an integer
type(x) == type(1)
# check if x is a NoneType
type(x) == type(None)

Часто существуют лучшие способы сделать это, особенно с любым недавним Python. Но если Вы только хотите помнить одну вещь, можно помнить это.

В этом случае лучшие пути были бы:

# check if x is a regular string
type(x) == str
# check if x is either a regular string or a unicode string
type(x) in [str, unicode]
# alternatively:
isinstance(x, basestring)
# check if x is an integer
type(x) == int
# check if x is a NoneType
x is None

Отметьте последний случай: существует только один экземпляр NoneType в Python, и это None. Вы будете видеть NoneType много в исключениях (TypeError: 'NoneType' object is unsubscriptable - происходит со мной все время..), но Вы почти никогда не должны будете обращаться к нему в коде.

Наконец, как fengshaun указывает, введите регистрацию в Python, не всегда хорошая идея. Это - больше pythonic, чтобы просто использовать значение, как будто это - тип, который Вы ожидаете, и выгода (или позвольте распространять), исключения, которые следуют из него.

14
ответ дан 23 November 2019 в 22:09
поделиться

Для других типов проверьте модуль типов:

>>> import types
>>> x = "mystring"
>>> isinstance(x, types.StringType)
True
>>> x = 5
>>> isinstance(x, types.IntType)
True
>>> x = None
>>> isinstance(x, types.NoneType)
True

P.S. Typechecking является плохой идеей.

23
ответ дан 23 November 2019 в 22:09
поделиться

Во-первых, избегайте всех сравнений типов. Они очень, очень редко необходимы. Иногда, они помогают проверить типы параметра в функцию - даже это редко. Неправильно введите данные, повысит исключение, и это - все, в чем Вы будете когда-либо нуждаться.

Все основные функции преобразования отобразятся как равные функции типа.

type(9) is int
type(2.5) is float
type('x') is str
type(u'x') is unicode
type(2+3j) is complex

Существует несколько других случаев.

isinstance( 'x', basestring )
isinstance( u'u', basestring )
isinstance( 9, int )
isinstance( 2.5, float )
isinstance( (2+3j), complex )

Ни одному, BTW, никогда не нужен ни один этот вид проверки типа. Ни один не единственный экземпляр NoneType. Ни один не возражает, Singleton. Просто не проверьте ни на Один

variable is None

BTW, не используйте вышеупомянутое в целом. Используйте обычные исключения и собственный естественный полиморфизм Python.

32
ответ дан 23 November 2019 в 22:09
поделиться

isinstance работы:

if isinstance(obj, MyClass): do_foo(obj)

но, имейте в виду: если похоже на утку, и если это походит на утку, это - утка.

Править: Поскольку Ни один не вводит, можно просто сделать:

if obj is None: obj = MyClass()
36
ответ дан 23 November 2019 в 22:09
поделиться

Это - потому что необходимо записать

s="hello"
type(s) == type("")

тип принимает экземпляр и возвращает его тип. В этом случае необходимо сравнить типы двух экземпляров.

Если необходимо сделать упреждающую проверку, лучше, если Вы проверяете на поддерживаемый интерфейс, чем тип.

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

Например, предположите, что у Вас есть этот код

def firstElement(parameter):
    return parameter[0]

Теперь, предположите, что Вы говорите: Я хочу, чтобы этот код принял только кортеж.

import types

def firstElement(parameter):
    if type(parameter) != types.TupleType:
         raise TypeError("function accepts only a tuple")
    return parameter[0]

Это уменьшает возможность многократного использования этой стандартной программы. Это не будет работать при передаче списка, или строки или numpy.array. Что-то лучше было бы

def firstElement(parameter):
    if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
        raise TypeError("interface violation")
    return parameter[0]

но нет никакого смысла в выполнении его: параметр [0] повысит исключение, если протокол не будет удовлетворен так или иначе... это, конечно, если Вы не хотите предотвратить побочные эффекты или имеющий необходимость восстановиться с вызовов, которые Вы могли вызвать перед сбоем. (Глупый) пример, только для высказывания мнения:

def firstElement(parameter):
    if not (hasattr(parameter, "__getitem__") and callable(getattr(parameter,"__getitem__"))):
        raise TypeError("interface violation")
    os.system("rm file")
    return parameter[0]

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

5
ответ дан 23 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: