Você quer verificar se algum objeto
age como um número em certas circunstâncias
Se você estiver usando Python 2.5 ou anterior, a única maneira real é verificar algumas dessas "circunstâncias específicas" e ver.
Em 2.6 ou melhor, você pode usar isinstance
com números.Number - uma classe base abstrata (ABC) que existe exatamente para este propósito (muitos mais ABCs existem no collections
módulo para várias formas de coleções / contêineres, novamente começando com 2.6; e, também apenas nessas versões, você pode adicionar facilmente suas próprias classes base abstratas, se necessário).
Bach para 2.5 e anteriores, "pode ser adicionado 0
e não é iterável" pode ser uma boa definição em alguns casos. Mas, você realmente precisa se perguntar o que é que você está pedindo que o que você deseja considerar "um número" deve definitivamente ser capaz de fazer , e o que deve ser absolutamente incapaz de fazer - e verificar.
Isso também pode ser necessário no 2.6 ou posterior, talvez com o propósito de fazer seus próprios registros para adicionar tipos de seu interesse que ainda não tenham sido registrados numbers.Numbers
- se você quiser excluir alguns tipos que afirmam serem números, mas você simplesmente não consigo lidar, isso leva ainda mais cuidado, já que os ABCs não têm nenhum unregister
método [[por exemplo, você pode fazer seu próprio ABC WeirdNum
e registrar lá todos esses tipos estranhos para você, então primeiro verifique se há algum método isinstance
antes de prosseguir para verificar isinstance
o normal numbers.Number
para continuar com êxito.
BTW, se e quando você precisar verificar se x
pode ou não fazer algo, geralmente você tem que tentar algo como:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
A presença de __add__
per se não diz nada de útil, uma vez que, por exemplo, todas as sequências o possuem para fins de concatenação com outras sequências. Essa verificação é equivalente à definição "um número é algo tal que uma sequência dessas coisas é um único argumento válido para a função embutida sum
", por exemplo. Tipos totalmente estranhos (por exemplo, aqueles que levantam a exceção "errada" quando somados a 0, como, digamos, a ZeroDivisionError
ou ValueError
& c) irão propagar a exceção, mas tudo bem, avise o usuário o mais rápido possível que esses tipos malucos não são aceitáveis no bom companhia;-); mas, um "vetor" que pode ser somado a um escalar (a biblioteca padrão do Python não tem um, mas é claro que eles são populares como extensões de terceiros) também daria o resultado errado aqui, portanto (por exemploo "não permitido para ser iterável" (por exemplo, cheque que iter(x)
aumenta TypeError
, ou para a presença de método especial __iter__
- se você estiver no 2.5 ou anterior e, portanto, precisa de seus próprios cheques).
Um breve vislumbre de tais complicações pode ser suficiente para motivá-lo a confiar em classes de base abstratas sempre que possível ... ;-).