Python,如果 a 或 b 和 c 未按预期工作

Python, if a or b and c , not working as expected

我遇到了一个感觉很简单但我想不通的问题。

下面的示例 returns 'else' 符合预期:

a, b, c = False, False, True
if a or b and c:
    print('if')
else:
    print('else')

现在,如果我将相同的逻辑应用于我的项目,如下所示:

import time, vlc

def play_sound(path):
    _ = vlc.MediaPlayer(path)
    _.play()

def check_commands(audio_capture):
if 'who' or 'what' in audio_capture and "are you" in audio_capture:
    play_sound("ResponseToCommands/response_A.mp3")
    time.sleep(2.2)

elif audio_capture == "are you ready":
    play_sound("ResponseToCommands/response_B.mp3")

check_commands('are you ready')
time.sleep(5) # optional
check_commands('what are you')

我希望得到相同的结果。但是,我一直收到 response_A.mp3 而不是先 response_B 然后 response_A.

如有任何建议,我们将不胜感激。

你的条件被解析为

if 'who' or ('what' in audio_capture and "are you" in audio_capture):

'who' 是真值,因此整个条件为真,无需检查 audio_capture.

中的值

你想要的是

if ('who' in audio_capture or 'what' in audio_capture) and "are you" in audio_capture:

in 不会像乘法分布在加法上那样“分布”在 or 上。

在第一个例子中,简单地写 if a or b and c worked 因为这仅仅意味着如果 a 是 True 或者 b 是 True 并且 c 是 True。但是你不能对没有布尔值的例子使用相同的 因此,解决方案很简单

def check_commands(audio_capture):
    if 'who' in audio_capture or 'what' in audio_capture and "are you" in audio_capture:
        play_sound("ResponseToCommands/response_A.mp3")
        time.sleep(2.2)

这应该很简单