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 or
Operator memilih argumen pertama dengan positif nilai kebenaran :
if ("Jon"):
Dan karena "Jon" memiliki nilai kebenaran positif, if
blok 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 if
blok 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 in
operator 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. ast
Modul 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 if
penampilan 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 or
diterapkan untuk beberapa values
, yaitu, a == b
dan c
, d
, dan e
.