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

  • BenjiManTV

    BenjiManTV

    20 Mart 2011
  • inovationgmbh

    inovationgmb

    28 EYLÜL 2010
  • MysteryGuitarMan

    MysteryGuita

    16 HAZİRAN 2006