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 isinstancecom números.Number - uma classe base abstrata (ABC) que existe exatamente para este propósito (muitos mais ABCs existem no collectionsmó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 0e 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 unregistermétodo [[por exemplo, você pode fazer seu próprio ABC WeirdNume registrar lá todos esses tipos estranhos para você, então primeiro verifique se há algum método isinstanceantes de prosseguir para verificar isinstanceo normal numbers.Numberpara continuar com êxito.
BTW, se e quando você precisar verificar se xpode 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 ZeroDivisionErrorou 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 ... ;-).