Ich möchte meinen eigenen Operator definieren. Unterstützt Python so etwas?
Antworten:
Während Sie in Python technisch gesehen keine neuen Operatoren definieren können, umgeht dieser clevere Hack diese Einschränkung. Sie können Infix-Operatoren wie folgt definieren:
# simple multiplication
x=Infix(lambda x,y: x*y)
print 2 |x| 4
# => 8
# class checking
isa=Infix(lambda x,y: x.__class__==y.__class__)
print [1,2,3] |isa| []
print [1,2,3] <<isa>> []
# => True
pipe
von kombiniert toolz
. pip = Infix(lambda x,y: pipe(x,y))
. dann 8 |pip| range |pip| sum |pip| range
. scheint zu funktionieren.
Nein, Python wird mit einer vordefinierten, aber überschreibbaren Reihe von Operatoren geliefert .
-->
scheint Pseudocode zu sein. Die Bibliothek selbst ist nur überlastet >>
.
Sage bietet diese Funktionalität im Wesentlichen unter Verwendung des von @Ayman Hourieh beschriebenen "cleveren Hacks", der jedoch als Dekorateur in ein Modul integriert wurde, um ein saubereres Erscheinungsbild und zusätzliche Funktionen zu erzielen. Sie können den zu überladenden Bediener und damit die Reihenfolge der Auswertung auswählen.
from sage.misc.decorators import infix_operator
@infix_operator('multiply')
def dot(a,b):
return a.dot_product(b)
u=vector([1,2,3])
v=vector([5,4,3])
print(u *dot* v)
# => 22
@infix_operator('or')
def plus(x,y):
return x*y
print(2 |plus| 4)
# => 6
Weitere Informationen finden Sie in der Sage-Dokumentation und in diesem Erweiterungsverfolgungsticket .
Wenn Sie beabsichtigen, die Operation auf eine bestimmte Klasse von Objekten anzuwenden, können Sie einfach den Operator überschreiben, der Ihrer Funktion am nächsten kommt. Durch Überschreiben __eq__()
wird beispielsweise der ==
Operator überschrieben , um das zurückzugeben, was Sie möchten. Dies funktioniert für fast alle Bediener.
Python 3.5 führt das Symbol @
für einen zusätzlichen Operator ein.
PEP465 führte diesen neuen Operator für die Matrixmultiplikation ein, um die Notation vieler numerischer Codes zu vereinfachen. Der Operator wird nicht für alle Typen implementiert, sondern nur für Arrays-ähnliche Objekte.
Sie können den Operator für Ihre Klassen / Objekte durch Implementierung unterstützen __matmul__()
.
Das PEP lässt Platz für eine andere Verwendung des Operators für nicht Arrays-ähnliche Objekte.
Natürlich können Sie mit @
jeder Art von Operation, die sich von der Matrixmultiplikation unterscheidet, auch für arraysähnliche Objekte implementieren , aber die Benutzererfahrung wird beeinträchtigt, da jeder erwartet, dass sich Ihr Datentyp anders verhält.
@
ein neues Operatorsymbol ist? Oder dass wir es irgendwie verwenden können, um eigene neue Operatoren zu definieren?
@
ein neuer Operator ist. Das ist es. Die Tatsache bleibt weiterhin bestehen: Sie können in Python keine eigenen Operatoren definieren.
$
) und dann etwas Python-Code verwenden, um sich selbst (mitopen
) zu bearbeiten und allesa $ b
infunction(a,b)