Я бы сказал, что вы (ОП) обязательно должны прочитать ссылочную ссылку, которая дает множество деталей о том, почему проверка типа объекта обычно является плохой идеей, и что вы, вероятно, должны делать вместо этого.
Джефф Шеннон
2
Вы должны использовать basestr, а не str. в противном случае вы не выберете Unicode. (хотя для 3.x я думаю, что str является basestr)
hasen
36
isinstance работает:
if isinstance(obj,MyClass): do_foo(obj)
но имейте в виду: если это похоже на утку, и если это звучит как утка, это утка.
РЕДАКТИРОВАТЬ: Для типа None, вы можете просто сделать:
def distance_from_zero(n): if isinstance(n,int) or isinstance(n,float): return abs(n) else: return "Nope" print distance_from_zero(True) Это возвращает «1» вместо «Нет». Как обойти это?
dig_123 14.12.14
Если вы хотите использовать, isinstanceно проверьте, а Noneзатем isinstance(obj, (MyClass, type(None)))работает. types.NoneTypeбыл удален из Python 3, поэтому он не так переносим, type(None)чтобы получить ссылку на NoneType.
Сантери Пааволайнен
33
Во-первых, избегайте всех сравнений типов. Они очень, очень редко нужны. Иногда они помогают проверить типы параметров в функции - даже это редко. Неправильный тип данных вызовет исключение, и это все, что вам когда-либо понадобится.
Все основные функции преобразования будут отображаться как равные функции типа.
type(9)is int
type(2.5)is float
type('x')is str
type(u'x')is unicode
type(2+3j)is complex
Никто, кстати, никогда не нуждается в такой проверке типов. Ни один не является единственным экземпляром NoneType. Ни один объект не является синглтоном. Просто проверьте Нет
variable isNone
Кстати, не используйте вышеизложенное в целом. Используйте обычные исключения и собственный природный полиморфизм Python.
Если вы проверяете входные данные из DSL, вам нужно все это, даже NoneType. Что делать , если параметр может быть str, unicodeили None? isinstance(x, (str, unicode, types.NoneType))намного чище, чем проверять None. Если вы создаете инструменты для отложенных вычислений или собираетесь запустить длительный или ресурсоемкий процесс, очень важно typeсвоевременно обнаруживать ошибки на каком-то этапе проверки. Это была критическая часть почти каждого научного компьютерного проекта, над которым я когда-либо работал. Из всех разработок, которые я видел, это нужно больше, чем не нужно.
>>>import types
>>> x ="mystring">>> isinstance(x, types.StringType)True>>> x =5>>> isinstance(x, types.IntType)True>>> x =None>>> isinstance(x, types.NoneType)True
Вы всегда можете использовать 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)
Часто есть лучшие способы сделать это, особенно с любым недавним питоном. Но если вы хотите запомнить только одну вещь, вы можете запомнить это.
В этом случае лучшие способы будут:
# 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 isNone
Обратите внимание на последний случай: NoneTypeв Python есть только один экземпляр , и это так None. Вы будете часто видеть NoneType в исключениях (TypeError: 'NoneType' object is unsubscriptable - случается со мной все время ..), но вам вряд ли когда-нибудь понадобится ссылаться на него в коде.
Наконец, как указывает fengshaun, проверка типов в python не всегда хорошая идея. Более питонно просто использовать значение, как если бы оно было ожидаемым вами типом, и перехватывать (или разрешать распространять) исключения, возникающие из него.
Для чего стоит isinstance () является предпочтительным способом проверки типов в Python (когда это необходимо сделать).
Дэвид Z
6
Ты очень близко! stringэто модуль, а не тип. Вы, вероятно, хотите сравнить тип objс объектом типа для строк, а именно str:
type(obj)== str # this works because str is already a type
В качестве альтернативы:
type(obj)== type('')
Обратите внимание, что в Python 2, если objэто тип Unicode, то ни один из вышеперечисленных не будет работать. И не будет isinstance(). См. Комментарии Джона к этому посту, чтобы узнать, как обойти это ... Я пытался вспомнить это около 10 минут, но у меня был блок памяти!
Используйте базовую строку с isinstance (), чтобы получить как str, так и unicode.
Джон Фухи
5
Это потому, что вы должны написать
s="hello"
type(s)== type("")
Тип принимает экземпляр и возвращает его тип. В этом случае вы должны сравнить два типа экземпляров.
Если вам нужно сделать упреждающую проверку, лучше проверить поддерживаемый интерфейс, чем тип.
Тип на самом деле мало что говорит вам, за исключением того факта, что вашему коду нужен экземпляр определенного типа, независимо от того, что у вас может быть другой экземпляр совершенно другого типа, что было бы прекрасно, потому что он реализует тот же интерфейс ,
Например, предположим, у вас есть этот код
def firstElement(parameter):return parameter[0]
Теперь предположим, что вы говорите: я хочу, чтобы этот код принимал только кортеж.
import types
def firstElement(parameter):if type(parameter)!= types.TupleType:raiseTypeError("function accepts only a tuple")return parameter[0]
Это уменьшает возможность повторного использования этой процедуры. Это не сработает, если вы передадите список, или строку, или numpy.array. Что-то лучше было бы
но в этом нет никакого смысла: параметр [0] вызовет исключение, если протокол все равно не будет удовлетворен ... это, конечно, если вы не хотите предотвратить побочные эффекты или нет необходимости восстанавливаться после вызовов, которые вы могли бы вызвать до сбоя. (Глупый) пример, просто чтобы подчеркнуть:
Спасибо за указание фактического предпочтительного способа проверки интерфейсов. Многие ответы здесь упоминают об этом, но лишь немногие приводят примеры того, что хорошо. Это все еще не отвечает на мой личный вопрос напрямую (я пытаюсь отделить список строк, содержащих много значимых элементов, от строки, которая содержит много не значащих элементов. Спасибо!
Ник
5
Используйте str вместо строки
type ( obj )== str
объяснение
>>> a ="Hello">>> type(a)==str
True>>> type(a)<type 'str'>>>>
да? почему это вообще плохая идея? Это только плохая идея для строк (для версий до 3.0), потому что есть два типа строк: str и unicode. Для массивов это хорошая идея imho.
Hasen
@hasen: это плохая идея в целом. Что если я определю свой собственный тип, который ведет себя как массив, но, скажем, выбирает значения из базы данных? Ваш код потерпит неудачу с моим типом без причины.
Ну, вся причина (по крайней мере для меня) в проверке типа именно потому, что я хочу иметь дело с массивами иначе, чем с другими типами (включая типы, имитирующие массивы).
hasen
2
Ты не прав. Я приведу конкретный пример: в django есть ярлык для рендеринга шаблонов, который может принимать либо строку, либо массив строк. Теперь и строки, и массивы (списки) являются итеративными, но в этом случае функции должны различать их.
Чтобы получить тип, используйте __class__член, как вunknown_thing.__class__
Разговор о наборе утки здесь бесполезен, потому что он не отвечает на совершенно хороший вопрос. В моем коде приложения мне никогда не нужно знать тип чего-либо, но все равно полезно иметь способ узнать тип объекта. Иногда мне нужно получить реальный класс для проверки модульного теста. Утиная печать мешает, потому что все возможные объекты имеют одинаковый API, но только один является правильным. Кроме того, иногда я поддерживаю чужой код и не знаю, какой тип объекта мне передали. Это моя самая большая проблема с динамически типизированными языками, такими как Python. Версия 1 очень проста и быстро разрабатывается. Версия 2 - это проблема, особенно если вы не написали версию 1. Поэтому иногда, когда я работаю с функцией, которую я не писал, мне нужно знать тип параметра,
Вот где __class__параметр пригодится. Это (насколько я могу судить) - лучший способ (возможно, единственный способ) получить тип объекта.
Использование isinstance(object, type). Как и выше, это легко использовать, если вы знаете правильный type, например,
isinstance('dog', str)## gives bool True
Но для более эзотерических объектов это может быть трудно использовать. Например:
import numpy as np
a = np.array([1,2,3])
isinstance(a,np.array)## breaks
но вы можете сделать этот трюк:
y = type(np.array([1]))
isinstance(a,y)## gives bool True
Поэтому я рекомендую создать экземпляр переменной ( yв данном случае) с типом объекта, который вы хотите проверить (например, type(np.array())), а затем использовать isinstance.
type(obj) == str
Ответы:
В твоем случае
isinstance("this is a string", str)
вернетсяTrue
.Вы также можете прочитать это: http://www.canonical.org/~kragen/isinstance/
источник
isinstance
работает:но имейте в виду: если это похоже на утку, и если это звучит как утка, это утка.
РЕДАКТИРОВАТЬ: Для типа None, вы можете просто сделать:
источник
def distance_from_zero(n): if isinstance(n,int) or isinstance(n,float): return abs(n) else: return "Nope" print distance_from_zero(True)
Это возвращает «1» вместо «Нет». Как обойти это?isinstance
но проверьте, аNone
затемisinstance(obj, (MyClass, type(None)))
работает.types.NoneType
был удален из Python 3, поэтому он не так переносим,type(None)
чтобы получить ссылку наNoneType
.Во-первых, избегайте всех сравнений типов. Они очень, очень редко нужны. Иногда они помогают проверить типы параметров в функции - даже это редко. Неправильный тип данных вызовет исключение, и это все, что вам когда-либо понадобится.
Все основные функции преобразования будут отображаться как равные функции типа.
Есть несколько других случаев.
Никто, кстати, никогда не нуждается в такой проверке типов. Ни один не является единственным экземпляром NoneType. Ни один объект не является синглтоном. Просто проверьте Нет
Кстати, не используйте вышеизложенное в целом. Используйте обычные исключения и собственный природный полиморфизм Python.
источник
NoneType
. Что делать , если параметр может бытьstr
,unicode
илиNone
?isinstance(x, (str, unicode, types.NoneType))
намного чище, чем проверятьNone
. Если вы создаете инструменты для отложенных вычислений или собираетесь запустить длительный или ресурсоемкий процесс, очень важноtype
своевременно обнаруживать ошибки на каком-то этапе проверки. Это была критическая часть почти каждого научного компьютерного проекта, над которым я когда-либо работал. Из всех разработок, которые я видел, это нужно больше, чем не нужно.Для других типов, проверьте модуль типов :
PS Проверка типов - плохая идея.
источник
Вы всегда можете использовать
type(x) == type(y)
трюк, гдеy
есть что-то с известным типом.Часто есть лучшие способы сделать это, особенно с любым недавним питоном. Но если вы хотите запомнить только одну вещь, вы можете запомнить это.
В этом случае лучшие способы будут:
Обратите внимание на последний случай:
NoneType
в Python есть только один экземпляр , и это такNone
. Вы будете часто видеть NoneType в исключениях (TypeError: 'NoneType' object is unsubscriptable
- случается со мной все время ..), но вам вряд ли когда-нибудь понадобится ссылаться на него в коде.Наконец, как указывает fengshaun, проверка типов в python не всегда хорошая идея. Более питонно просто использовать значение, как если бы оно было ожидаемым вами типом, и перехватывать (или разрешать распространять) исключения, возникающие из него.
источник
Ты очень близко!
string
это модуль, а не тип. Вы, вероятно, хотите сравнить типobj
с объектом типа для строк, а именноstr
:В качестве альтернативы:
Обратите внимание, что в Python 2, если
obj
это тип Unicode, то ни один из вышеперечисленных не будет работать. И не будетisinstance()
. См. Комментарии Джона к этому посту, чтобы узнать, как обойти это ... Я пытался вспомнить это около 10 минут, но у меня был блок памяти!источник
Это потому, что вы должны написать
Тип принимает экземпляр и возвращает его тип. В этом случае вы должны сравнить два типа экземпляров.
Если вам нужно сделать упреждающую проверку, лучше проверить поддерживаемый интерфейс, чем тип.
Тип на самом деле мало что говорит вам, за исключением того факта, что вашему коду нужен экземпляр определенного типа, независимо от того, что у вас может быть другой экземпляр совершенно другого типа, что было бы прекрасно, потому что он реализует тот же интерфейс ,
Например, предположим, у вас есть этот код
Теперь предположим, что вы говорите: я хочу, чтобы этот код принимал только кортеж.
Это уменьшает возможность повторного использования этой процедуры. Это не сработает, если вы передадите список, или строку, или numpy.array. Что-то лучше было бы
но в этом нет никакого смысла: параметр [0] вызовет исключение, если протокол все равно не будет удовлетворен ... это, конечно, если вы не хотите предотвратить побочные эффекты или нет необходимости восстанавливаться после вызовов, которые вы могли бы вызвать до сбоя. (Глупый) пример, просто чтобы подчеркнуть:
в этом случае ваш код вызовет исключение перед выполнением вызова system (). Без проверки интерфейса вы удалили бы файл, а затем вызвали исключение.
источник
Используйте str вместо строки
объяснение
источник
я использую
type(x) == type(y)
Например, если я хочу проверить что-то, это массив:
проверка строки:
Если вы хотите проверить None, используйте
источник
я думаю, что это должно сделать это
источник
Тип не работает на определенных классах. Если вы не уверены в типе объекта, используйте
__class__
метод следующим образом:Также смотрите эту статью - http://www.siafoo.net/article/56
источник
Чтобы получить тип, используйте
__class__
член, как вunknown_thing.__class__
Разговор о наборе утки здесь бесполезен, потому что он не отвечает на совершенно хороший вопрос. В моем коде приложения мне никогда не нужно знать тип чего-либо, но все равно полезно иметь способ узнать тип объекта. Иногда мне нужно получить реальный класс для проверки модульного теста. Утиная печать мешает, потому что все возможные объекты имеют одинаковый API, но только один является правильным. Кроме того, иногда я поддерживаю чужой код и не знаю, какой тип объекта мне передали. Это моя самая большая проблема с динамически типизированными языками, такими как Python. Версия 1 очень проста и быстро разрабатывается. Версия 2 - это проблема, особенно если вы не написали версию 1. Поэтому иногда, когда я работаю с функцией, которую я не писал, мне нужно знать тип параметра,
Вот где
__class__
параметр пригодится. Это (насколько я могу судить) - лучший способ (возможно, единственный способ) получить тип объекта.источник
Использование
isinstance(object, type)
. Как и выше, это легко использовать, если вы знаете правильныйtype
, например,Но для более эзотерических объектов это может быть трудно использовать. Например:
но вы можете сделать этот трюк:
Поэтому я рекомендую создать экземпляр переменной (
y
в данном случае) с типом объекта, который вы хотите проверить (например,type(np.array())
), а затем использоватьisinstance
.источник
Вы можете сравнить классы для проверки уровня.
источник