Was ist die Rangfolge beim schreiben eine doppelte Ungleichheit in Python (explizit im code, und wie kann dieser überschrieben werden, für die arrays?)
Was ist der spezifische code, in order, ausgeführt wird, wenn ich nach etwas Fragen, wie
>>> 1 <= 3 >= 2
True
Wenn beide haben die gleiche Priorität und es ist einfach die Reihenfolge Ihrer Auswertung, warum die zweite Ungleichung Funktion als (3 >= 2)
statt (True >= 2)
Betrachten Sie zum Beispiel den Unterschied zwischen diesen
>>> (1 < 3) < 2
True
>>> 1 < 3 < 2
False
Ist es nur eine Reine syntaktische short-cut " hart-codiert in Python zu erweitern, die zweite als die and
von den beiden Aussagen?
Konnte ich dieses Verhalten ändern, für eine Klasse, so dass a <= b <= c
wird erweitert, um etwas anderes? Es sieht wie im folgenden ist der Fall
a (logical operator) b (logical operator) c
--> (a logical operator b) and (b logical operator c)
aber die eigentliche Frage ist, wie dieser wird in code umgesetzt.
Ich bin neugierig, so dass ich replizieren kann, diese Art von __lt__
und __gt__
Verhalten in einige meiner eigenen Klassen, aber ich bin verwirrt darüber, wie dies erreicht wird, hält die Mitte argument konstant.
Hier ist ein konkretes Beispiel:
>>> import numpy as np
>>> tst = np.asarray([1,2,3,4,5,6])
>>> 3 <= tst
array([False, False, True, True, True, True], dtype=bool)
>>> 3 <= tst <= 5
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/home/ely/<ipython-input-135-ac909818f2b1> in <module>()
----> 1 3 <= tst <= 5
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Wäre es schön, dies zu ändern, so dass es "funktioniert einfach" mit arrays zu, wie diese:
>>> np.logical_and(3 <= tst, tst <= 5)
array([False, False, True, True, True, False], dtype=bool)
Hinzugefügt zur Klärung
In die Kommentare es wird darauf hingewiesen, dass ich habe einen schlechten job erklären die Frage. Hier einige klärende Bemerkungen:
1) ich bin nicht der Suche nach einer einfachen Erklärung der Tatsache, dass der Dolmetscher erscheint ein and
zwischen den beiden angekettet Ungleichheiten. Ich wusste bereits, dass und sagte so oben.
2) Für eine Analogie zu dem, was ich tun will, betrachten Sie das with
- Anweisung (link). Die folgenden:
with MyClass(some_obj) as foo:
do_stuff()
entpackt in
foo = MyClass(some_obj)
foo.__enter__()
try:
do_stuff()
finally:
foo.__exit__()
So schreiben MyClass
angemessen, ich kann viele Besondere Dinge in der with
- Anweisung.
Ich Frage, ob es einen ähnlichen code Auspacken der verketteten Ungleichheit, durch die ich abfangen kann, was es tut, und leiten Sie zu verwenden der array-Stil logischen Operatoren statt nur für die Klassen I-Sorgfalt über.
Ich glaube, das ist ganz klar aus meiner Frage, die vor allem das Beispiel, aber ich hoffe das macht es klarer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht ganz sicher, was du suchst, aber eine schnelle Demontage zeigt, dass
a < b < c
ist nicht zusammengestellt, um den gleichen bytecode alsa < b and b < c
Edit 1: Graben weiter, ich denke, das ist etwas komisch oder falsch mit numpy. Beachten Sie in diesem Beispiel code, ich denke, es funktioniert wie man es erwarten würde.
Edit 2: Tatsächlich so funktioniert das nicht "richtig"...
Ich denke, es ist zu vergleichen Boolesche Werte in zahlen in der zweite Vergleich der
1 < x < 3
.Edit 3: ich weiß nicht, wie die Idee der Rücksendung nicht-Boolesche Werte aus dem gt, lt, gte, lte speziellen Methoden, aber es ist eigentlich nicht eingeschränkt, nach der Python-Dokumentation.
http://docs.python.org/reference/datamodel.html#object.lt
list((-1 < vect)[:,0]) and list((vect < 5)[:,0])
dann funktioniert es. Also dieand
ist erstickt an der Tatsache, dass es zwei Argumente sindnumpy.ndarray
stattlist
. Dies ist sehr merkwürdig; es bedeutet, dass__gt__
und__lt__
müssen einige zusätzlichendarray
Reste in Ihnen.__and__
.__and__
ist). Dieand
Betreiber kann nicht jedes element weiser Logik, es ist einfach nicht möglich, in Python, das Ergebnis ist, was Sie finden in Edit 2. Nur der Letzte Vergleich/Objekt zurückgegeben werden kann, und das wird nicht das tun, was Sie erwarten.and
.JUMP_IF_FALSE_OP_POP
Logik, die genau der and-operator.Beide haben die gleiche Rangfolge, doch sind ausgewertet von Links nach rechts entsprechend der Dokumentation. Ein Ausdruck der form
a <= b <= c
wird erweitert, uma <= b and b <= c
.a <= b <= c
wird erweitert, uma <= b and b <= c
__and__
.array([0,5]) > 2
undarray([2,5]) < 10
beide arbeiten und produzieren eine bool-dtyped array, aber(array([0,5]) > 2) and (array([2,5]) < 10)
nicht, weil dieser Ausdruck mehrdeutig ist und numpy entscheidet sich zu weigern, der Versuchung zu erraten. Man kann nicht sagen, Python, etwas anderes alsand
zu unchain Vergleich.and
der zwei separate Ungleichungen verwenden soll NumPylogical_and
- Funktion anstelle von Pythonand
Betrieb. Ich möchte dies überschreiben, so dass der ausbau-arbeiten mit NumPy ist. @DSM, ich glaube, du bist Missverständnis mich. Ich weiß, dass es nativ ist die ganze "Wahrheit Wert in einem array ist mehrdeutig" dealie. Ich Frage, wie kann ich schaffen Ungleichheiten, die die Nutzung der bestehenden array-Logik-tools entsprechend behandeln.a < 5
erzeugt ein array von Bools auch3 < a < 5
ähnlich produzieren ein array. Ob dies nur ein hard-codiert in die Dolmetscherin, so dass es immer verwenden müssen-Python-nativeand
bei der Erweiterung des Ausdrucks, dann OK, aber diese Antwort gar nicht eingehen. Und wenn es hart codiert, das scheint so schlecht und unflexibel und unpythonic, insbesondere angesichts der Tatsache, wie Häufig dies wäre in NumPy.a <= b <= c
wird erweitert, uma <= b and b <= c
ist falsch.Meinst du , wie der interpreter wandelt es, oder was? Sie sagte bereits
also ich bin mir nicht sicher, was du fragst hierOK, ich fand es heraus: Nein, Sie können nicht überschreiben die expansion von
a < b < c
in(a < b) and (b < c)
IIUC.Es hängt davon ab, welche der
a
,b
undc
im Ausdrucka < b < c
sind Instanzen einer eigenen Klasse. Die Umsetzung Ihrer__lt__
und__gt__
und Methoden wird einige Weg, aber die Dokumentation weist darauf hin, dass:So, wenn Sie wollen
Int < MyClass < Int
, sind Sie aus Glück heraus. Sie müssen mindestensMyClass < MyClass < Something
(also eine Instanz der Klasse wird auf der LHS der jeden Vergleich in der erweitert-Ausdruck).a < b < c
ina < b and b < c
ist nur hard-codiert in den code für diesen Teil ein Dolmetscher? Es gibt keine Möglichkeit (abgesehen von der Verzweigung Python-source) für einige Klassen, erweitern Sie mitnumpy.logical_and
statt, so dass logische arrays werden korrekt behandelt?and
aber es macht am meisten Sinn für unsere Klassen. Dies ist eine sehr häufige Art der operation in Python Pandas und in NumPy, also es ist nicht so, ich Frage für einige sehr Arkane array unterstützen. Zum Beispiel, sofort wieder ein array von bools aus der hervorgeht, wo eine date-variable fällt zwischen einem gültigen start-und end-Datum wäre viel besser ausgedrückt als eine verkettete Ungleichheit.and
dazwischen. Aber denken Sie an diewith
- Anweisung. Umgesetzt wird dies mit einem__enter__
dann eintry
block und dann einfinally
mit der__exit__
nennen. Sie können viel tun, der syntax manipulation von wissen, wiewith
funktioniert. Ich hatte gehofft, dass verkettet Ungleichheiten in ähnlicher Weise reduziert auf eine Sequenz von calls auf einige__
Typ Funktionen, die mit der Handhabung der Verkettung explizit in einer dieser Funktionen.