Vergleichsoperatoren können in Python verkettet werden, so dass zB x < y < z
das Ergebnis von (x < y) and (y < z)
angibt, außer dass y
garantiert nur einmal ausgewertet wird.
Der abstrakte Syntaxbaum dieser Operation sieht folgendermaßen aus:
%Vor%Schön gedruckt:
%Vor% Aber es scheint etwas wie 0 < < 1 2
zu analysieren und ich bin mir nicht sicher, wie ich das mit dem logischen Ergebnis von etwas wie 0 < 1 and 1 < 2
in Einklang bringen soll.
Wie können die für verkettete Vergleiche erklärt werden?
Der Grund dafür wird in den ast
Dokumenten
%Vor%
Wenn es als zwei separate Vergleiche ausgewertet würde, wie dies
%Vor%Dann vergleicht es tatsächlich das boolesche Ergebnis des ersten Vergleichs mit der Ganzzahl im zweiten Vergleich.
So etwas würde nicht funktionieren
%Vor%Weil es als
bewertet würde %Vor%Was als
bewertet wird %Vor% Stattdessen wird es als einzelner Ausdruck behandelt. Eine Python-Implementierung der Operation Compare
würde in etwa so aussehen
Ich denke, dass Sie es als Kurzschluss-Pipeline von Dingen betrachten müssen, die Sie tun müssen. z.B. Wenn Sie zip
the ops
mit comparators
haben und dann nacheinander an ihnen arbeiten:
Offensichtlich überlasse ich hier einen Haufen der Fantasie ... z. Ich habe evaluate
nicht definiert. Es ist jedoch ziemlich schwer zu definieren, da wir nicht wissen, wie der Komparatorausdruck im allgemeinen Fall aussieht.
Ich möchte Brendan Abels Antwort mit meiner Version der Funktion Compare()
ergänzen, die IMHO ein wenig ist leichter zu verstehen:
Tags und Links python abstract-syntax-tree