SORU
19 EYLÜL 2008, Cuma


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
19 EYLÜL 2008, Cuma


İ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 :

  1. 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 ya bool değerini döndürür, veya eşit ise False kabul int bir değeri olmalı.

  2. 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 kap False eğer boş (uzunluk (sıfır).

  3. Aksi halde, nesnenin bu durumda False kabul None sürece True 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 :

  1. Eğer nesne __eq__ bir yöntem varsa, denir, ve dönüş değeri boolbir değere dönüştürülür ve if sonucunu belirlemek için kullanılır.

  2. 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).

  3. 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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fuse

    Fuse

    21 Kasım 2005
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007
  • thenewboston

    thenewboston

    4 ŞUBAT 2008