Eu diria que você (o OP) deve ler definitivamente o link referenciado, o que fornece muitos detalhes sobre por que verificar o tipo de um objeto geralmente é uma má idéia e o que você provavelmente deveria estar fazendo.
10119 Jeff Shannon
2
você deve usar basestr, não str. caso contrário, você não escolherá unicode. (embora para 3.x Acho que str é o basestr)
Hasen
36
isinstance trabalho:
if isinstance(obj,MyClass): do_foo(obj)
mas lembre-se: se parece um pato e se parece com um pato, é um pato.
EDIT: Para o tipo None, você pode simplesmente fazer:
def distance_from_zero(n): if isinstance(n,int) or isinstance(n,float): return abs(n) else: return "Nope" print distance_from_zero(True) Isso retorna um "1" em vez de "Nope". Como contornar isso?
dig_123
Se você deseja usar, isinstancemas verifique também para None, em seguida, isinstance(obj, (MyClass, type(None)))funciona. types.NoneTypefoi removido do Python 3, portanto, não é tão portátil quanto type(None)obter uma referência NoneType.
Santeri Paavolainen
33
Primeiro, evite todas as comparações de tipos. Eles são muito, muito raramente necessários. Às vezes, eles ajudam a verificar os tipos de parâmetros em uma função - mesmo que isso seja raro. Dados de tipo errado geram uma exceção e é tudo o que você precisa.
Todas as funções básicas de conversão serão mapeadas como iguais à função type.
type(9)is int
type(2.5)is float
type('x')is str
type(u'x')is unicode
type(2+3j)is complex
Nenhum, BTW, nunca precisa desse tipo de verificação de tipo. Nenhuma é a única instância de NoneType. O objeto None é um Singleton. Basta verificar Nenhum
variable isNone
BTW, não use o descrito acima em geral. Use exceções comuns e o polimorfismo natural do próprio Python.
Se você estiver validando entradas de uma DSL, precisará de tudo isso, inclusive NoneType. E se um parâmetro pode ser um str, unicodeou None? isinstance(x, (str, unicode, types.NoneType))é muito mais limpo do que procurar None. Se você estiver construindo ferramentas para computação adiada ou se estiver prestes a iniciar um processo longo ou com muitos recursos, é importante detectar typeerros com antecedência, durante alguma etapa de validação personalizada. Essa foi uma parte crítica de quase todos os projetos de computação científica em que já trabalhei. De todos os projetos de desenvolvimento que eu já vi, mais precisam disso do que não.
>>>import types>>> x ="mystring">>> isinstance(x, types.StringType)True>>> x =5>>> isinstance(x, types.IntType)True>>> x =None>>> isinstance(x, types.NoneType)True
Você sempre pode usar o type(x) == type(y)truque, onde yhá algo com tipo conhecido.
# 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)
Muitas vezes, existem maneiras melhores de fazer isso, principalmente em qualquer python recente. Mas se você quer apenas se lembrar de uma coisa, pode se lembrar disso.
Nesse caso, as melhores maneiras seriam:
# 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
Observe o último caso: existe apenas uma instância de NoneTypeem python, e é isso None. Você verá o NoneType muito em exceções ( TypeError: 'NoneType' object is unsubscriptable- acontece comigo o tempo todo ..), mas quase nunca precisará se referir a ele no código.
Finalmente, como fengshaun aponta, a verificação de tipo no python nem sempre é uma boa ideia. É mais pitônico usar apenas o valor como se fosse o tipo que você espera e capturar (ou permitir propagar) exceções resultantes dele.
Pelo que vale, isinstance () é a maneira preferida de verificar tipos em Python (quando você precisar fazer isso).
David Z
6
Você está muito perto! stringé um módulo, não um tipo. Você provavelmente deseja comparar o tipo de objcom o objeto de tipo de strings, a saber str:
type(obj)== str # this works because str is already a type
Alternativamente:
type(obj)== type('')
Observe que, no Python 2, se objfor do tipo unicode, nenhuma das opções acima funcionará. Nem vai isinstance(). Veja os comentários de John neste post para saber como contornar isso ... Estou tentando lembrá-lo há cerca de 10 minutos, mas estava com um bloco de memória!
Use basestring com isinstance () para obter str e unicode.
31410 John Fouhy
5
É porque você tem que escrever
s="hello"
type(s)== type("")
type aceita uma instância e retorna seu tipo. Nesse caso, você deve comparar os tipos de duas instâncias.
Se você precisar fazer uma verificação preventiva, é melhor verificar se há uma interface suportada do que o tipo.
O tipo realmente não diz muito, além do fato de que seu código deseja uma instância de um tipo específico, independentemente do fato de que você poderia ter outra instância de um tipo completamente diferente, o que seria perfeitamente adequado porque implementa a mesma interface .
Por exemplo, suponha que você tenha esse código
def firstElement(parameter):return parameter[0]
Agora, suponha que você diga: quero que esse código aceite apenas uma tupla.
import typesdef firstElement(parameter):if type(parameter)!= types.TupleType:raiseTypeError("function accepts only a tuple")return parameter[0]
Isso está reduzindo a reutilização dessa rotina. Não funcionará se você passar uma lista, uma string ou um numpy.array. Algo melhor seria
mas não adianta fazê-lo: o parâmetro [0] gerará uma exceção se o protocolo não for atendido de qualquer maneira ... é claro, a menos que você queira evitar efeitos colaterais ou se recuperar de chamadas que você poderia chamar antes de falhar. Exemplo (estúpido), apenas para deixar claro:
nesse caso, seu código gerará uma exceção antes de executar a chamada system (). Sem verificações de interface, você teria removido o arquivo e, em seguida, levantado a exceção.
Obrigado por indicar a maneira preferida real de verificar interfaces. Muitas das respostas aqui mencionam isso, mas poucas dão exemplos do que é bom. Ele ainda não respondeu à minha pergunta pessoal diretamente (eu estou tentando separar uma lista de strings, contendo muitos, itens significativos, a partir de uma string, que contém muitos, e não itens significativos Graças.!
Nick
5
Use str em vez de string
type ( obj )== str
Explicação
>>> a ="Hello">>> type(a)==str
True>>> type(a)<type 'str'>>>>
Hã? por que é uma má ideia em geral? É apenas uma péssima idéia para strings (para a versão 3.0), porque existem dois tipos de strings, str e unicode. Para matrizes, é uma boa ideia imho.
hasen
@ hasen: é uma má ideia em geral. E se eu definir meu próprio tipo que se comporte como uma matriz, mas, digamos, buscar valores de um banco de dados? Seu código falhará com meu tipo sem motivo.
Bem, todo o motivo (pelo menos para mim) na verificação do tipo é exatamente porque eu quero lidar com matrizes de maneira diferente de outros tipos (incluindo tipos que imitam matrizes).
hasen
2
Você está errado. Vou dar um exemplo concreto: o django possui um atalho de renderização de modelo que pode aceitar uma string ou uma matriz de strings. Agora, as seqüências de caracteres e as matrizes (listas) são iteráveis, mas, neste caso, as funções precisam diferenciar entre elas.
Para obter o tipo, use o __class__membro, como emunknown_thing.__class__
Falar em digitar patos é inútil aqui, porque não responde a uma pergunta perfeitamente boa. No código do meu aplicativo, nunca preciso saber o tipo de algo, mas ainda é útil ter uma maneira de aprender o tipo de um objeto. Às vezes, preciso obter a turma real para validar um teste de unidade. A digitação com patos atrapalha o caminho porque todos os objetos possíveis têm a mesma API, mas apenas um está correto. Além disso, às vezes estou mantendo o código de outra pessoa e não tenho idéia de que tipo de objeto fui passado. Este é o meu maior problema com linguagens dinamicamente tipadas como Python. A versão 1 é muito fácil e rápida de desenvolver. A versão 2 é uma chatice, especialmente se você não escreveu a versão 1. Então, às vezes, quando estou trabalhando com uma função que não escrevi, preciso saber o tipo de parâmetro,
É aí que o __class__parâmetro é útil. Essa (até onde eu sei) é a melhor maneira (talvez a única) de obter o tipo de um objeto.
Use isinstance(object, type). Como acima, isso é fácil de usar se você souber o correto type, por exemplo,
isinstance('dog', str)## gives bool True
Mas para objetos mais esotéricos, isso pode ser difícil de usar. Por exemplo:
import numpy as np
a = np.array([1,2,3])
isinstance(a,np.array)## breaks
mas você pode fazer este truque:
y = type(np.array([1]))
isinstance(a,y)## gives bool True
Portanto, recomendo instanciar uma variável ( yneste caso) com um tipo de objeto que você deseja verificar (por exemplo, type(np.array())) e depois usá-lo isinstance.
type(obj) == str
Respostas:
No seu caso,
isinstance("this is a string", str)
retornaráTrue
.Você também pode ler isto: http://www.canonical.org/~kragen/isinstance/
fonte
isinstance
trabalho:mas lembre-se: se parece um pato e se parece com um pato, é um pato.
EDIT: Para o tipo None, você pode simplesmente fazer:
fonte
def distance_from_zero(n): if isinstance(n,int) or isinstance(n,float): return abs(n) else: return "Nope" print distance_from_zero(True)
Isso retorna um "1" em vez de "Nope". Como contornar isso?isinstance
mas verifique também paraNone
, em seguida,isinstance(obj, (MyClass, type(None)))
funciona.types.NoneType
foi removido do Python 3, portanto, não é tão portátil quantotype(None)
obter uma referênciaNoneType
.Primeiro, evite todas as comparações de tipos. Eles são muito, muito raramente necessários. Às vezes, eles ajudam a verificar os tipos de parâmetros em uma função - mesmo que isso seja raro. Dados de tipo errado geram uma exceção e é tudo o que você precisa.
Todas as funções básicas de conversão serão mapeadas como iguais à função type.
Existem alguns outros casos.
Nenhum, BTW, nunca precisa desse tipo de verificação de tipo. Nenhuma é a única instância de NoneType. O objeto None é um Singleton. Basta verificar Nenhum
BTW, não use o descrito acima em geral. Use exceções comuns e o polimorfismo natural do próprio Python.
fonte
NoneType
. E se um parâmetro pode ser umstr
,unicode
ouNone
?isinstance(x, (str, unicode, types.NoneType))
é muito mais limpo do que procurarNone
. Se você estiver construindo ferramentas para computação adiada ou se estiver prestes a iniciar um processo longo ou com muitos recursos, é importante detectartype
erros com antecedência, durante alguma etapa de validação personalizada. Essa foi uma parte crítica de quase todos os projetos de computação científica em que já trabalhei. De todos os projetos de desenvolvimento que eu já vi, mais precisam disso do que não.Para outros tipos, consulte o módulo de tipos :
PS Typechecking é uma má idéia.
fonte
Você sempre pode usar o
type(x) == type(y)
truque, ondey
há algo com tipo conhecido.Muitas vezes, existem maneiras melhores de fazer isso, principalmente em qualquer python recente. Mas se você quer apenas se lembrar de uma coisa, pode se lembrar disso.
Nesse caso, as melhores maneiras seriam:
Observe o último caso: existe apenas uma instância de
NoneType
em python, e é issoNone
. Você verá o NoneType muito em exceções (TypeError: 'NoneType' object is unsubscriptable
- acontece comigo o tempo todo ..), mas quase nunca precisará se referir a ele no código.Finalmente, como fengshaun aponta, a verificação de tipo no python nem sempre é uma boa ideia. É mais pitônico usar apenas o valor como se fosse o tipo que você espera e capturar (ou permitir propagar) exceções resultantes dele.
fonte
Você está muito perto!
string
é um módulo, não um tipo. Você provavelmente deseja comparar o tipo deobj
com o objeto de tipo de strings, a saberstr
:Alternativamente:
Observe que, no Python 2, se
obj
for do tipo unicode, nenhuma das opções acima funcionará. Nem vaiisinstance()
. Veja os comentários de John neste post para saber como contornar isso ... Estou tentando lembrá-lo há cerca de 10 minutos, mas estava com um bloco de memória!fonte
É porque você tem que escrever
type aceita uma instância e retorna seu tipo. Nesse caso, você deve comparar os tipos de duas instâncias.
Se você precisar fazer uma verificação preventiva, é melhor verificar se há uma interface suportada do que o tipo.
O tipo realmente não diz muito, além do fato de que seu código deseja uma instância de um tipo específico, independentemente do fato de que você poderia ter outra instância de um tipo completamente diferente, o que seria perfeitamente adequado porque implementa a mesma interface .
Por exemplo, suponha que você tenha esse código
Agora, suponha que você diga: quero que esse código aceite apenas uma tupla.
Isso está reduzindo a reutilização dessa rotina. Não funcionará se você passar uma lista, uma string ou um numpy.array. Algo melhor seria
mas não adianta fazê-lo: o parâmetro [0] gerará uma exceção se o protocolo não for atendido de qualquer maneira ... é claro, a menos que você queira evitar efeitos colaterais ou se recuperar de chamadas que você poderia chamar antes de falhar. Exemplo (estúpido), apenas para deixar claro:
nesse caso, seu código gerará uma exceção antes de executar a chamada system (). Sem verificações de interface, você teria removido o arquivo e, em seguida, levantado a exceção.
fonte
Use str em vez de string
Explicação
fonte
eu uso
type(x) == type(y)
Por exemplo, se eu quiser verificar algo é uma matriz:
verificação de cadeia:
Se você deseja verificar Nenhum, use
fonte
eu acho que isso deve fazer
fonte
Tipo não funciona em determinadas classes. Se você não tiver certeza do tipo do objeto, use o
__class__
método da seguinte maneira:Consulte também este artigo - http://www.siafoo.net/article/56
fonte
Para obter o tipo, use o
__class__
membro, como emunknown_thing.__class__
Falar em digitar patos é inútil aqui, porque não responde a uma pergunta perfeitamente boa. No código do meu aplicativo, nunca preciso saber o tipo de algo, mas ainda é útil ter uma maneira de aprender o tipo de um objeto. Às vezes, preciso obter a turma real para validar um teste de unidade. A digitação com patos atrapalha o caminho porque todos os objetos possíveis têm a mesma API, mas apenas um está correto. Além disso, às vezes estou mantendo o código de outra pessoa e não tenho idéia de que tipo de objeto fui passado. Este é o meu maior problema com linguagens dinamicamente tipadas como Python. A versão 1 é muito fácil e rápida de desenvolver. A versão 2 é uma chatice, especialmente se você não escreveu a versão 1. Então, às vezes, quando estou trabalhando com uma função que não escrevi, preciso saber o tipo de parâmetro,
É aí que o
__class__
parâmetro é útil. Essa (até onde eu sei) é a melhor maneira (talvez a única) de obter o tipo de um objeto.fonte
Use
isinstance(object, type)
. Como acima, isso é fácil de usar se você souber o corretotype
, por exemplo,Mas para objetos mais esotéricos, isso pode ser difícil de usar. Por exemplo:
mas você pode fazer este truque:
Portanto, recomendo instanciar uma variável (
y
neste caso) com um tipo de objeto que você deseja verificar (por exemplo,type(np.array())
) e depois usá-loisinstance
.fonte
Você pode comparar as classes para o nível de verificação.
fonte