Eu tive que olhar duas vezes quando vi isso. O Java SE8 agora contém números inteiros não assinados, e eu desenvolvi tanto com isso que parece pecaminoso que o Java nunca teve números inteiros não assinados antes do SE8.
Existem maneiras certas e erradas de fazer praticamente tudo em Python. Aqui está o caminho certo:
Usar type
>>> type(one)<type 'int'>
Você pode usar o __name__atributo para obter o nome do objeto. (Esse é um dos poucos atributos especiais que você precisa usar __dunder__para obter o nome - não há nem um método para ele no inspectmódulo.)
>>> type(one).__name__
'int'
Não use __class__
No Python, os nomes que começam com sublinhados semanticamente não fazem parte da API pública e é uma prática recomendada para os usuários evitar usá-los. (Exceto quando for absolutamente necessário.)
Como typenos dá a classe do objeto, devemos evitar obtê-lo diretamente. :
>>> one.__class__
Geralmente, essa é a primeira ideia que as pessoas têm ao acessar o tipo de um objeto em um método - elas já estão procurando atributos, portanto, o tipo parece estranho. Por exemplo:
classFoo(object):def foo(self):
self.__class__
Não. Em vez disso, digite (self):
classFoo(object):def foo(self):
type(self)
Detalhes de implementação de entradas e flutuadores
Como vejo o tipo de uma variável, seja ela sem assinatura de 32 bits, com assinatura de 16 bits, etc.?
No Python, essas especificidades são detalhes de implementação. Portanto, em geral, geralmente não nos preocupamos com isso no Python. No entanto, para saciar sua curiosidade ...
No Python 2, int geralmente é um número inteiro assinado igual à largura da palavra da implementação (limitada pelo sistema). É geralmente implementado como um longa em C . Quando os números inteiros ficam maiores que isso, geralmente os convertemos para Python longs (com precisão ilimitada, para não confundir com C longs).
Por exemplo, em um Python 2 de 32 bits, podemos deduzir que int é um inteiro assinado de 32 bits:
>>>import sys
>>> format(sys.maxint,'032b')'01111111111111111111111111111111'>>> format(-sys.maxint -1,'032b')# minimum value, see docs.'-10000000000000000000000000000000'
No Python 3, o antigo int desaparece, e nós apenas usamos (do Python) desde int, que tem precisão ilimitada.
Também podemos obter algumas informações sobre os carros alegóricos do Python, que geralmente são implementados como um duplo em C:
Não use __class__, uma API semanticamente não pública, para obter o tipo de uma variável. Use em typevez disso.
E não se preocupe muito com os detalhes de implementação do Python. Eu não tive que lidar com problemas em torno disso sozinho. Você provavelmente também não, e se realmente o fizer, deve saber o suficiente para não procurar nesta resposta o que fazer.
tipo sai como <type instance>mas __class__dá email.message.Message- o que estou fazendo de errado?
Jasen
@ Jasen Você está usando Python 2 e não está herdando object?
Aaron Hall
sim, apenas import email não usando classes de minha própria invenção.
Jasen
65
print type(variable_name)
Eu também recomendo o interpretador interativo IPython ao lidar com perguntas como esta. Ele permite digitar variable_name?e retornará uma lista completa de informações sobre o objeto, incluindo o tipo e a sequência de documentos para o tipo.
por exemplo
In[9]: var =123In[10]: var?Type: int
BaseClass:<type 'int'>StringForm:123Namespace:InteractiveDocstring:
int(x[, base])-> integer
Converta uma sequência ou número em um número inteiro, se possível. Um argumento de ponto flutuante será truncado em direção a zero (isso não inclui uma representação de string de um número de ponto flutuante!) Ao converter uma string, use a base opcional. É um erro fornecer uma base ao converter uma não-string. Se o argumento estiver fora do intervalo inteiro, um objeto longo será retornado.
re: comment "os nomes que começam com sublinhados ..." (únicos) são muito diferentes dos sublinhados duplos ("dunders") e são definitivamente parte da API pública e certamente é bom usá-los. Isso pode ser de grande ajuda ... youtu.be/wf-BqAjZb8M
michael
31
Exemplos de verificação de tipo simples no Python:
assert type(variable_name)== int
assert type(variable_name)== bool
assert type(variable_name)== list
Eu acho que este é muito melhor do que a função type para usar no processo de verificação. Se você quiser verificar e agir com o resultado que você tem que usar try catch com tipo mas isinstance retorna verdadeiro ou falso
alkanschtein
24
A pergunta é um tanto ambígua - não sei ao certo o que você quer dizer com "visualizar". Se você está tentando consultar o tipo de um objeto Python nativo, a resposta do @atzz o direcionará na direção certa.
No entanto, se você estiver tentando gerar objetos Python que tenham a semântica de tipos C primitivos (como uint32_t, int16_t), use o structmódulo Você pode determinar o número de bits em uma dada primitiva do tipo C da seguinte maneira:
Python não possui esses tipos que você descreve. Existem dois tipos usados para representar valores integrais:, intque corresponde ao tipo int da plataforma em C e long, que é um número inteiro de precisão arbitrário (ou seja, cresce conforme necessário e não possui um limite superior). ints são convertidos silenciosamente para longse uma expressão produzir resultado no qual não possa ser armazenado int.
Realmente depende de qual nível você quer dizer. No Python 2.x, existem dois tipos de números inteiros int(restritos a sys.maxint) e long(precisão ilimitada), por razões históricas. No código Python, isso não deve fazer muita diferença, porque o intérprete é convertido automaticamente em longo quando um número é muito grande. Se você deseja saber sobre os tipos de dados reais usados no interpretador subjacente, isso depende da implementação. (Os CPython estão localizados em Objects / intobject.c e Objects / longobject.c.) Para saber mais sobre os tipos de sistemas, consulte a resposta do cdleary para usar o módulo struct.
Não faça isso. Pedir o tipo de algo é errado por si só. Em vez disso, use polimorfismo. Encontre ou, se necessário, defina por si mesmo o método que faz o que você deseja para qualquer tipo de entrada possível e chame-o sem perguntar nada. Se você precisar trabalhar com tipos internos ou definidos por uma biblioteca de terceiros, sempre poderá herdar deles e usar seus próprios derivados. Ou você pode envolvê-los em sua própria classe. Essa é a maneira orientada a objetos para resolver esses problemas.
Se você insistir em verificar o tipo exato e colocar alguns ifs sujos aqui e ali, poderá usar a __class__propriedade ou a typefunção para fazê-lo, mas em breve você estará atualizando todos esses ifs com casos adicionais a cada dois ou três commits. Fazer isso da maneira OO evita isso e permite definir apenas uma nova classe para um novo tipo de entrada.
Respostas:
Use a
type()
função interna:Para verificar se uma variável é de um determinado tipo, use
isinstance
:Observe que o Python não possui os mesmos tipos de C / C ++, o que parece ser sua pergunta.
fonte
Você pode estar procurando a função interna .
type()
Veja os exemplos abaixo, mas não há tipo "não assinado" no Python, assim como Java.
Número inteiro positivo:
Inteiro positivo grande :
Número inteiro negativo:
Sequência literal de caracteres:
Inteiro de ponto flutuante:
fonte
É tão simples. Você faz assim.
fonte
Então, se você tem uma variável, por exemplo:
Você quer saber o seu tipo?
Existem maneiras certas e erradas de fazer praticamente tudo em Python. Aqui está o caminho certo:
Usar
type
Você pode usar o
__name__
atributo para obter o nome do objeto. (Esse é um dos poucos atributos especiais que você precisa usar__dunder__
para obter o nome - não há nem um método para ele noinspect
módulo.)Não use
__class__
No Python, os nomes que começam com sublinhados semanticamente não fazem parte da API pública e é uma prática recomendada para os usuários evitar usá-los. (Exceto quando for absolutamente necessário.)
Como
type
nos dá a classe do objeto, devemos evitar obtê-lo diretamente. :Geralmente, essa é a primeira ideia que as pessoas têm ao acessar o tipo de um objeto em um método - elas já estão procurando atributos, portanto, o tipo parece estranho. Por exemplo:
Não. Em vez disso, digite (self):
Detalhes de implementação de entradas e flutuadores
No Python, essas especificidades são detalhes de implementação. Portanto, em geral, geralmente não nos preocupamos com isso no Python. No entanto, para saciar sua curiosidade ...
No Python 2, int geralmente é um número inteiro assinado igual à largura da palavra da implementação (limitada pelo sistema). É geralmente implementado como um longa em C . Quando os números inteiros ficam maiores que isso, geralmente os convertemos para Python longs (com precisão ilimitada, para não confundir com C longs).
Por exemplo, em um Python 2 de 32 bits, podemos deduzir que int é um inteiro assinado de 32 bits:
No Python 3, o antigo int desaparece, e nós apenas usamos (do Python) desde int, que tem precisão ilimitada.
Também podemos obter algumas informações sobre os carros alegóricos do Python, que geralmente são implementados como um duplo em C:
Conclusão
Não use
__class__
, uma API semanticamente não pública, para obter o tipo de uma variável. Use emtype
vez disso.E não se preocupe muito com os detalhes de implementação do Python. Eu não tive que lidar com problemas em torno disso sozinho. Você provavelmente também não, e se realmente o fizer, deve saber o suficiente para não procurar nesta resposta o que fazer.
fonte
<type instance>
mas__class__
dáemail.message.Message
- o que estou fazendo de errado?object
?import email
não usando classes de minha própria invenção.Eu também recomendo o interpretador interativo IPython ao lidar com perguntas como esta. Ele permite digitar
variable_name?
e retornará uma lista completa de informações sobre o objeto, incluindo o tipo e a sequência de documentos para o tipo.por exemplo
Converta uma sequência ou número em um número inteiro, se possível. Um argumento de ponto flutuante será truncado em direção a zero (isso não inclui uma representação de string de um número de ponto flutuante!) Ao converter uma string, use a base opcional. É um erro fornecer uma base ao converter uma não-string. Se o argumento estiver fora do intervalo inteiro, um objeto longo será retornado.
fonte
print type(str)
retorna um erro no Python 3.6. Usetype(str)
print(type(str))
print type(var)
código incorreto.fonte
Mais uma maneira de usar
__class__
:fonte
Exemplos de verificação de tipo simples no Python:
fonte
Pode ser pouco irrelevante. mas você pode verificar os tipos de um objeto
isinstance(object, type)
como mencionado aqui .fonte
A pergunta é um tanto ambígua - não sei ao certo o que você quer dizer com "visualizar". Se você está tentando consultar o tipo de um objeto Python nativo, a resposta do @atzz o direcionará na direção certa.
No entanto, se você estiver tentando gerar objetos Python que tenham a semântica de tipos C primitivos (como
uint32_t
,int16_t
), use ostruct
módulo Você pode determinar o número de bits em uma dada primitiva do tipo C da seguinte maneira:Isso também se reflete no
array
módulo, que pode criar matrizes desses tipos de nível inferior:O número máximo máximo suportado (Python 2
int
) é dado por sys.maxint .Há também sys.getsizeof , que retorna o tamanho real do objeto Python na memória residual:
Para dados flutuantes e dados de precisão, use sys.float_info :
fonte
Você quer dizer em Python ou usando ctypes ?
No primeiro caso, você simplesmente não pode - porque o Python não possui números inteiros de 16/32 bits assinados / não assinados.
No segundo caso, você pode usar
type()
:Para obter mais referências sobre ctypes e seu tipo, consulte a documentação oficial .
fonte
Python não possui esses tipos que você descreve. Existem dois tipos usados para representar valores integrais:,
int
que corresponde ao tipo int da plataforma em C elong
, que é um número inteiro de precisão arbitrário (ou seja, cresce conforme necessário e não possui um limite superior).int
s são convertidos silenciosamente paralong
se uma expressão produzir resultado no qual não possa ser armazenadoint
.fonte
Simples, para python 3.4 e superior
Python 2.7 e superior
fonte
Realmente depende de qual nível você quer dizer. No Python 2.x, existem dois tipos de números inteiros
int
(restritos asys.maxint
) elong
(precisão ilimitada), por razões históricas. No código Python, isso não deve fazer muita diferença, porque o intérprete é convertido automaticamente em longo quando um número é muito grande. Se você deseja saber sobre os tipos de dados reais usados no interpretador subjacente, isso depende da implementação. (Os CPython estão localizados em Objects / intobject.c e Objects / longobject.c.) Para saber mais sobre os tipos de sistemas, consulte a resposta do cdleary para usar o módulo struct.fonte
Para python2.x, use
Para python3.x, use
fonte
Não faça isso. Pedir o tipo de algo é errado por si só. Em vez disso, use polimorfismo. Encontre ou, se necessário, defina por si mesmo o método que faz o que você deseja para qualquer tipo de entrada possível e chame-o sem perguntar nada. Se você precisar trabalhar com tipos internos ou definidos por uma biblioteca de terceiros, sempre poderá herdar deles e usar seus próprios derivados. Ou você pode envolvê-los em sua própria classe. Essa é a maneira orientada a objetos para resolver esses problemas.
Se você insistir em verificar o tipo exato e colocar alguns
if
s sujos aqui e ali, poderá usar a__class__
propriedade ou atype
função para fazê-lo, mas em breve você estará atualizando todos essesif
s com casos adicionais a cada dois ou três commits. Fazer isso da maneira OO evita isso e permite definir apenas uma nova classe para um novo tipo de entrada.fonte