Pour une raison quelconque, cette instruction se déclenche, peu importe ce que la variable "msg" a stocké. Il ne devrait réagir qu'à ce que vous voyez dans le code. Veuillez me faire savoir si j'ai correctement écrit cette déclaration ou si je dois la formater d'une autre manière. Je vous remercie

if (username == "ssj3goku878") or (username == "mgnlive") and msg == "!load": 
     keyholder.holdForSeconds("F7", 1);
if (username == "ssj3goku878") or (username == "mgnlive") and msg == "!save": 
     keyholder.holdForSeconds("F8", 1);
0
ssj3goku878 20 juil. 2015 à 06:17

3 réponses

Meilleure réponse

En raison de la priorité de l'opérateur or a une priorité de liaison inférieure que and. Par exemple, une expression similaire à la vôtre est:

a or b and c

Qui est interprété comme indiqué par les parenthèses:

a or (b and c)

Car and a une priorité plus élevée. Dans ce cas, l'expression sera toujours True si a est True, et la sous-expression (b and c) ne sera pas évaluée. Ainsi, la valeur de la sous-expression ne fait aucune différence et la modification de la valeur de c n'affectera donc pas le résultat (N.B lorsque a est True).

Ainsi, pour votre expression, chaque fois que username == "ssj3goku878" est True, la valeur de msg n'a aucune incidence sur le résultat global et vous constaterez que les deux instructions if exécutent leur corps.

Pour corriger cela, vous devez ajouter explicitement des parenthèses pour remplacer les priorités par défaut:

if ((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load": 
     keyholder.holdForSeconds("F7", 1)

Vous avez probablement plus de 2 utilisateurs et préféreriez ne pas avoir à modifier votre programme chaque fois qu'un nouvel utilisateur est ajouté, donc cela pourrait être préférable:

users = ["ssj3goku878", "mgnlive", "user3"]
if username in users and msg == '!load':
    keyholder.holdForSeconds("F7", 1)

La liste users peut être remplie à partir d'un fichier, d'une base de données ou d'une autre source persistante. Dans ce cas, in a une priorité plus élevée que and, donc les parenthèses ne sont pas nécessaires, cependant, il est souvent plus facile d'ajouter explicitement des parenthèses qu'il ne vous appartient (ou à quiconque lit votre code) de se souvenir (ou recherche) les précédents, donc c'est généralement mieux:

if (username in users) and msg == '!load':
4
mhawke 20 juil. 2015 à 03:50

Python évalue et opère avant ou les opérateurs (sauf s'ils sont entre parenthèses). Par conséquent, si vous souhaitez que la logique soit évaluée de la manière souhaitée, vous devez ajouter des parenthèses, par exemple:

if ((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load":
     keyholder.holdForSeconds("F7", 1);

Pour plus d'informations sur le fonctionnement de ces opérateurs, cliquez ici: https://docs.python.org/2 /library/stdtypes.html#boolean-operations-and-or-not

1
Gamrix 20 juil. 2015 à 03:28

Vous avez besoin d'un autre ensemble de supports, c'est-à-dire

((username == "ssj3goku878") or (username == "mgnlive")) and msg == "!load": 
6
maxymoo 20 juil. 2015 à 03:20