9
votes

Comment expliquer l'arbre de syntaxe abstraite des opérations de comparaison chaînées?

Les opérateurs de comparaison peuvent être chaînés en python, de sorte que, par exemple, x devrait donner le résultat de (x , sauf que y est garanti pour être évalué une seule fois.

L'arborese de syntaxe abstraite de cette opération ressemble à: xxx

joli imprimé: xxx

mais il semble que cela semble Analysez comme quelque chose comme 0 << 1 2 Et je ne sais pas comment concilier que avec le résultat logique de quelque chose comme 0 <1 et 1 <2 .

Comment l'AST pour les comparaisons enchaînées peut-elle être expliquée?


0 commentaires

3 Réponses :


3
votes

Je pense que vous devez y penser comme un pipeline à court-circuit de choses à faire. par exemple. Si vous ZIP CODE> Le ops code> avec les comparateurs code>, puis travaillez-les un à la fois:

result = left
for op, comparator in zip(ops, comparators):
    result = result and evaluate(result, op, comparator)
    if not result:
        break


0 commentaires

6
votes

Le raisonnement derrière cela est en fait mentionné dans le ast code> docs

def Compare(left, ops, comparators):
    if not ops[0](left, comparators[0]):
        return False

    for i, comparator in enumerate(comparators[1:], start=1):
        if not ops[i](comparators[i-1], comparator):
            return False
    return True


1 commentaires

J'écrirais le comparer () la procédure un peu différemment. Voir Ma réponse .



2
votes

Je voudrais compléter La réponse de Brendan Abel avec ma version du Comparer () Fonction, que l'IMHO est un peu plus facile à comprendre: xxx


0 commentaires