variavel - Qual é a maneira canônica de verificar o tipo em Python?




tipo da variavel em python (6)

Qual é a melhor maneira de verificar se um determinado objeto é de um determinado tipo? Que tal verificar se o objeto herda de um determinado tipo?

Digamos que eu tenha um objeto o . Como faço para verificar se é um str ?


A maneira mais Python de checar o tipo de um objeto é ... não checá-lo.

Como o Python incentiva o Duck Typing , você deve try...except usar os métodos do objeto da maneira que você deseja usá-los. Portanto, se sua função estiver procurando por um objeto de arquivo gravável, não verifique se é uma subclasse de file , apenas tente usar seu método .write() !

É claro que, às vezes, essas abstrações podem ser quebradas, e isinstance(obj, cls) é o que você precisa. Mas use com moderação.


Aqui está um exemplo de porque a digitação de pato é má sem saber quando é perigosa. Por exemplo: Aqui está o código Python (possivelmente omitindo recuo adequado), observe que essa situação é evitável cuidando da instância e da subclasse de funções para garantir que, quando você realmente precisa de um pato, não consiga uma bomba.

class Bomb:
    def __init__(self):
        ""

    def talk(self):
        self.explode()

    def explode(self):
        print "BOOM!, The bomb explodes."

class Duck:
    def __init__(self):
        ""
    def talk(self):
        print "I am a duck, I will not blow up if you ask me to talk."    

class Kid:
    kids_duck = None

    def __init__(self):
        print "Kid comes around a corner and asks you for money so he could buy a duck."

    def takeDuck(self, duck):
        self.kids_duck = duck
        print "The kid accepts the duck, and happily skips along"

    def doYourThing(self):
        print "The kid tries to get the duck to talk"
        self.kids_duck.talk()

myKid = Kid()
myBomb = Bomb()
myKid.takeDuck(myBomb)
myKid.doYourThing()

Eu acho que o legal de usar uma linguagem dinâmica como Python é que você realmente não deveria ter que checar algo assim.

Gostaria de chamar os métodos necessários em seu objeto e capturar um AttributeError . Posteriormente, isso permitirá que você chame seus métodos com outros objetos (aparentemente não relacionados) para executar tarefas diferentes, como zombar de um objeto para teste.

Eu usei muito isso ao obter dados da web com urllib2.urlopen() que retorna um arquivo como objeto. Por sua vez, isso pode ser passado para quase qualquer método que lê um arquivo, porque implementa o mesmo método read() como um arquivo real.

Mas tenho certeza que há um tempo e lugar para usar o isinstance() , caso contrário, provavelmente não estaria lá :)


Para Hugo:

Você provavelmente quer dizer list ao invés de array , mas isso aponta para todo o problema com verificação de tipos - você não quer saber se o objeto em questão é uma lista, você quer saber se é algum tipo de seqüência ou se é um único objeto. Então tente usá-lo como uma sequência.

Digamos que você queira adicionar o objeto a uma sequência existente ou, se for uma sequência de objetos, adicioná-los todos

try:
   my_sequence.extend(o)
except TypeError:
  my_sequence.append(o)

Um truque com isso é se você está trabalhando com strings e / ou seqüências de strings - isso é complicado, já que uma string é frequentemente vista como um único objeto, mas também é uma sequência de caracteres. Pior que isso, como é realmente uma seqüência de seqüências de comprimento único.

Eu geralmente escolho projetar minha API para que ela aceite apenas um único valor ou uma sequência - isso facilita as coisas. Não é difícil colocar um [ ] ao redor do seu valor único quando você o passa, se necessário.

(Embora isso possa causar erros com seqüências de caracteres, como elas se parecem com (são) seqüências.)


Você pode verificar com a linha abaixo para verificar qual tipo de caractere o valor fornecido é:

def chr_type(chrx):
    if chrx.isalpha()==True:
        return 'alpha'
    elif chrx.isdigit()==True:
        return 'numeric'
    else:
        return 'nothing'

chr_type("12)

isinstance(o, str) retornará true se o for str ou for de um tipo que herda str .

type(o) is str irá retornar true se e somente se o for str. Ele retornará false se o for de um tipo que herda de str . ----





types