Wie erklärt man den abstrakten Syntaxbaum von verketteten Vergleichsoperationen?

8

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?

    
wim 04.11.2016, 20:46
quelle

3 Antworten

5

Der Grund dafür wird in den ast Dokumenten

erwähnt
%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

%Vor%     
Brendan Abel 04.11.2016, 21:01
quelle
3

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:

%Vor%

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.

    
mgilson 04.11.2016 20:54
quelle
2

Ich möchte Brendan Abels Antwort mit meiner Version der Funktion Compare() ergänzen, die IMHO ein wenig ist leichter zu verstehen:

%Vor%     
Leon 04.11.2016 21:17
quelle

Tags und Links