Neden &; yoksa " someobj:& = = Hiçbiri eğer someobj quot; daha iyi ":" Python?
Bu kodu çeşitli örnekler gördüm:
if not someobj:
#do something
Ama yapmıyorum neden ben merak ediyorum
if someobj == None:
#do something
Herhangi bir fark var mı? Bir diğer üzerinde bir avantaj var mı?
CEVAP
İlk test, Python eğer zaten biri değilse bool
değer nesnesi dönüştürmek için deneyin. Kabaca,anlamlı misin ? nesne soruyoruz :Bu aşağıdaki algoritma kullanılarak yapılır :
Eğer nesne
__nonzero__
özel bir yöntem sayısal ankastre,int
float
gibi) varsa, bu yöntemi çağırır. Sonra doğrudan kullanılan yabool
değerini döndürür, veya eşit iseFalse
kabulint
bir değeri olmalı.Aksi takdirde, eğer nesne var
__len__
özel yöntem (tıpkı konteyner inşa-ins,list
,dict
,set
,tuple
, ...), çağırır bu yöntem, düşünen bir kapFalse
eğer boş (uzunluk (sıfır).Aksi halde, nesnenin bu durumda
False
kabulNone
süreceTrue
olarak kabul edilir.
İkinci testte nesnenin None
eşitlik için karşılaştırılır. Buradanesne istiyoruz, bu diğer eşittir "değer mi?"Bu aşağıdaki algoritma kullanılarak yapılır :
Eğer nesne
__eq__
bir yöntem varsa, denir, ve dönüş değeribool
bir değere dönüştürülür veif
sonucunu belirlemek için kullanılır.Eğer nesne
__cmp__
bir yöntem varsa yoksa, denir. Bu işlev gerekir dönüşint
gösteren düzenin iki nesne (-1
self < other
,0
self == other
,1
self > other
).Aksi halde, nesnenin kimliği (örn. karşılaştırıldığında
is
operatör) tarafından test edilebilir olarak aynı nesne için referans.
Başka bir test mümkün is
operatör kullanıyor.Nesne soruyor, "bu belirli bir nesne Var mı?" olurdu
Genel olarak, ben tavsiye edeceğini kullanmak için ilk test ile olmayan sayısal değerleri kullanmak için test için eşitlik istediğinizde karşılaştırın nesnelerin aynı doğa (iki dize, iki sayı, ...) ve kontrol için kimlik sadece kullanırken sentinel değerler (None
anlam başlatılamadı için üye alanı için örneğin, veya kullanırken getattr
__getitem__
yöntemleri).
Özetlemek gerekirse, var :
>>> class A(object):
... def __repr__(self):
... return 'A()'
... def __nonzero__(self):
... return False
>>> class B(object):
... def __repr__(self):
... return 'B()'
... def __len__(self):
... return 0
>>> class C(object):
... def __repr__(self):
... return 'C()'
... def __cmp__(self, other):
... return 0
>>> class D(object):
... def __repr__(self):
... return 'D()'
... def __eq__(self, other):
... return True
>>> for obj in ['', (), [], {}, 0, 0., A(), B(), C(), D(), None]:
... print '%4s: bool(obj) -> %5s, obj == None -> %5s, obj is None -> %5s' % \
... (repr(obj), bool(obj), obj == None, obj is None)
'': bool(obj) -> False, obj == None -> False, obj is None -> False
(): bool(obj) -> False, obj == None -> False, obj is None -> False
[]: bool(obj) -> False, obj == None -> False, obj is None -> False
{}: bool(obj) -> False, obj == None -> False, obj is None -> False
0: bool(obj) -> False, obj == None -> False, obj is None -> False
0.0: bool(obj) -> False, obj == None -> False, obj is None -> False
A(): bool(obj) -> False, obj == None -> False, obj is None -> False
B(): bool(obj) -> False, obj == None -> False, obj is None -> False
C(): bool(obj) -> True, obj == None -> True, obj is None -> False
D(): bool(obj) -> True, obj == None -> True, obj is None -> False
None: bool(obj) -> False, obj == None -> True, obj is None -> True
Neden yerine HTML JSON oluşturulan dön...
Yöntem zincirleme - neden iyi bir uygu...
Neden RAISERROR yanlış yazılmış? Yoksa...
Neden sıralanmamış bir dizi daha hızlı...
Neden bu iki kez (1927) garip bir sonu...