Dalam banyak kasus, Python terlihat dan berperilaku seperti bahasa Inggris alami, tetapi ini adalah salah satu kasus di mana abstraksi tersebut gagal. Orang dapat menggunakan petunjuk konteks untuk menentukan bahwa "Jon" dan "Inbar" adalah objek yang digabungkan dengan kata kerja "sama dengan", tetapi penerjemah Python lebih berpikiran literal.
if name == "Kevin" or "Jon" or "Inbar":
secara logis setara dengan:
if (name == "Kevin") or ("Jon") or ("Inbar"):
Yang, bagi pengguna Bob, setara dengan:
if (False) or ("Jon") or ("Inbar"):
The orOperator memilih argumen pertama dengan positif nilai kebenaran :
if ("Jon"):
Dan karena "Jon" memiliki nilai kebenaran positif, ifblok tersebut dijalankan. Itulah yang menyebabkan "Akses diberikan" untuk dicetak terlepas dari nama yang diberikan.
Semua alasan ini juga berlaku untuk ekspresi tersebut if "Kevin" or "Jon" or "Inbar" == name. nilai pertama,, "Kevin"benar, sehingga ifblok dijalankan.
Ada dua cara umum untuk menyusun persyaratan ini dengan benar.
Gunakan beberapa ==operator untuk secara eksplisit memeriksa setiap nilai:
if name == "Kevin" or name == "Jon" or name == "Inbar":
Buat urutan nilai yang valid, dan gunakan inoperator untuk menguji keanggotaan:
if name in {"Kevin", "Jon", "Inbar"}:
Secara umum dari dua yang kedua lebih disukai karena lebih mudah dibaca dan juga lebih cepat:
>>> import timeit
>>> timeit.timeit('name == "Kevin" or name == "Jon" or name == "Inbar"', setup="name='Inbar'")
0.4247764749999945
>>> timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")
0.18493307199999265
Bagi yang mungkin menginginkan pembuktian yang if a == b or c or d or e: ...memang diurai seperti ini. astModul built-in memberikan jawaban:
>>> import ast
>>> ast.parse("if a == b or c or d or e: ...")
<_ast.Module object at 0x1031ae6a0>
>>> ast.dump(_)
"Module(body=[If(test=BoolOp(op=Or(), values=[Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), Name(id='c', ctx=Load()), Name(id='d', ctx=Load()), Name(id='e', ctx=Load())]), body=[Expr(value=Ellipsis())], orelse=[])])"
>>>
Sehingga test dari ifpenampilan pernyataan seperti ini:
BoolOp(
op=Or(),
values=[
Compare(
left=Name(id='a', ctx=Load()),
ops=[Eq()],
comparators=[Name(id='b', ctx=Load())]
),
Name(id='c', ctx=Load()),
Name(id='d', ctx=Load()),
Name(id='e', ctx=Load())
]
)
Seperti yang dapat dilihat, itu operator boolean orditerapkan untuk beberapa values, yaitu, a == bdan c, d, dan e.