Bir nesne olup olmadığını kontrol etmek istiyorsun
belirli durumlarda bir sayı gibi davranır
Python 2.5 veya daha eski bir sürümünü kullanıyorsanız, tek gerçek yol bu "belirli durumlardan" bazılarını kontrol etmek ve görmektir.
2.6 veya daha iyisi, sayılarla kullanabilirsiniz isinstance. Sayı - tam olarak bu amaç için var olan soyut bir temel sınıf (ABC) (içinde çok daha fazla ABC vardır)collections yine 2.6'dan başlayarak çeşitli koleksiyon / kap biçimleri modülde ; ve, ayrıca yalnızca bu sürümlerde, gerekirse kendi soyut temel sınıflarınızı kolayca ekleyebilirsiniz).
Bach 2.5 ve öncesi için "eklenebilir 0ve yinelenemez" bazı durumlarda iyi bir tanım olabilir. Ama, gerçekten sen dikkate almak istediğini "Bir numara" kesinlikle mümkün olması gerektiğini soruyoruz ne olduğunu, kendinize sormanız gerekir yapmak ve kesinlikle ne olmalıdır yapamaz ve check - yapmak.
Bu 2.6 veya sonraki sürümlerde de gerekli olabilir, belki de ilgilendiğiniz ancak henüz kaydedilmemiş türleri eklemek için kendi kayıtlarınızı yapmak amacıyla numbers.Numbers- sayı olduklarını iddia eden bazı türleri hariç tutmak istiyorsanız üstesinden gelemiyorum, bu daha da dikkat gerektiriyor, çünkü ABC'lerin hiçbir unregisteryöntemi yok [[örneğin kendi ABC'nizi oluşturabilir WeirdNumve sizin için bu tür tuhaf türleri orada kaydedebilirsiniz, sonra isinstancedevam etmeden önce bunun kurtarılmasını kontrol edin başarılı bir şekilde devam etmek için isinstancenormalin kontrol edilmesi numbers.Number.
BTW, bir şeyi yapıp xyapamayacağınızı kontrol etmeniz gerektiğinde , genellikle aşağıdaki gibi bir şey denemeniz gerekir:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
Bunun varlığı __add__size yararlı hiçbir şey söylemez, çünkü örneğin tüm diziler diğer dizilerle birleştirme amacıyla ona sahiptir. Bu kontrol, örneğin "bir sayı, böyle şeylerin bir dizisi yerleşik işlev için geçerli tek bir argüman olacak şekilde bir şeydir" tanımına eşdeğerdir sum. Tamamen tuhaf türler (örneğin, 0'a toplandığında "yanlış" istisnayı ortaya çıkaranlar, örneğin, a ZeroDivisionErrorveya ValueError& c gibi) istisnayı yayacaktır, ancak sorun değil, kullanıcıya en kısa sürede bu tür çılgın türlerin iyi olarak kabul edilmediğini bildirin şirket;-); ancak, bir skalere toplanabilen bir "vektör" (Python'un standart kitaplığında bir tane yoktur, ancak elbette üçüncü taraf uzantıları olarak popülerdirler) burada da yanlış sonuç verir, yani (örn."yinelenebilir olmasına izin verilmez" olanı (örneğin, iter(x)yükseltmeleri kontrol edin TypeErrorveya özel yöntemin varlığı __iter__- 2.5 veya daha önceki sürümdeyseniz ve bu nedenle kendi çeklerinize ihtiyacınız varsa).
Bu tür karmaşıklıklara kısa bir bakış, sizi mümkün olduğunda soyut temel sınıflara güvenmeye motive etmek için yeterli olabilir ... ;-).