Dalam tes pertama, Python mencoba untuk mengkonversi objek ke boolnilai jika belum. Secara kasar, kami menanyakan objek: apakah Anda bermakna atau tidak? Ini dilakukan dengan menggunakan algoritma berikut:
Jika objek memiliki __nonzero__metode khusus (seperti halnya numerik built-in, intdan float), ia memanggil metode ini. Itu harus mengembalikan boolnilai yang kemudian langsung digunakan, atau intnilai yang dianggap Falsejika sama dengan nol.
Jika tidak, jika objek memiliki __len__metode khusus (seperti halnya wadah built-in, list, dict, set, tuple, ...), itu panggilan metode ini, mengingat wadah Falsejika kosong (panjang adalah nol).
Jika tidak, objek dianggap Truekecuali kecuali Nonedalam hal ini, itu dianggap False.
Dalam tes kedua, objek dibandingkan untuk kesetaraan None. Di sini, kita bertanya objek, "Apakah Anda sama dengan nilai lainnya ini?" Ini dilakukan dengan menggunakan algoritma berikut:
Jika objek memiliki __eq__metode, itu disebut, dan nilai kembali kemudian dikonversi ke boolnilai dan digunakan untuk menentukan hasil dari if.
Kalau tidak, jika objek memiliki __cmp__metode, itu disebut. Fungsi ini harus mengembalikan inturutan kedua objek yang ditunjukkan ( -1jika self < other, 0jika self == other, +1jika self > other).
Jika tidak, objek tersebut dibandingkan untuk identitas (mis. Mereka merujuk ke objek yang sama, seperti yang dapat diuji oleh isoperator).
Ada tes lain yang mungkin menggunakan isoperator. Kami akan bertanya objek, "Apakah Anda objek khusus ini?"
Secara umum, saya akan merekomendasikan untuk menggunakan tes pertama dengan nilai-nilai non-numerik, untuk menggunakan tes untuk kesetaraan ketika Anda ingin membandingkan objek yang sifatnya sama (dua string, dua angka, ...) dan untuk memeriksa identitas hanya ketika menggunakan nilai sentinel ( Noneartinya tidak diinisialisasi untuk bidang anggota sebagai contoh, atau saat menggunakan getattratau __getitem__metode).
Untuk meringkas, kami memiliki:
>>> 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