Chciałbym zdefiniować własnego operatora. Czy Python obsługuje coś takiego?
Odpowiedzi:
Chociaż z technicznego punktu widzenia nie można zdefiniować nowych operatorów w Pythonie, ten sprytny hack pozwala obejść to ograniczenie. Pozwala zdefiniować operatory wrostkowe w ten sposób:
# 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
from toolz
. pip = Infix(lambda x,y: pipe(x,y))
. wtedy 8 |pip| range |pip| sum |pip| range
. wydaje się działać.
Nie, Python zawiera predefiniowany, ale nadający się do zastąpienia zestaw operatorów .
-->
wydaje się być psuedocode. Sama biblioteka po prostu się przeciąża >>
.
Sage zapewnia tę funkcjonalność, zasadniczo używając „sprytnego hacka” opisanego przez @Ayman Hourieh, ale włączonego do modułu jako dekorator, aby nadać bardziej przejrzysty wygląd i dodatkową funkcjonalność - możesz wybrać operatora do przeciążenia, a tym samym kolejność oceny.
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
Zobacz dokumentację Sage i ten raport śledzenia ulepszeń, aby uzyskać więcej informacji.
Jeśli zamierzasz zastosować operację na określonej klasie obiektów, możesz po prostu nadpisać operator, który jest najbliższy twojej funkcji ... na przykład, przesłanianie __eq__()
przesłoni ==
operator, aby zwrócił cokolwiek chcesz. Działa to dla prawie wszystkich operatorów.
Python 3.5 wprowadza symbol @
dodatkowego operatora.
PEP465 wprowadził ten nowy operator mnożenia macierzy, aby uprościć zapis wielu kodów numerycznych. Operator nie zostanie zaimplementowany dla wszystkich typów, ale tylko dla obiektów typu tablice.
Możesz wspierać operatora dla swoich klas / obiektów poprzez implementację __matmul__()
.
PEP pozostawia miejsce na inne użycie operatora dla obiektów innych niż tablice.
Oczywiście możesz zaimplementować @
dowolną operację inną niż mnożenie macierzy również dla obiektów przypominających tablice, ale wpłynie to na wrażenia użytkownika, ponieważ każdy będzie oczekiwał, że Twój typ danych będzie zachowywał się w inny sposób.
@
jest to nowy symbol operatora? Albo że możemy jakoś go użyć do zdefiniowania nowych własnych operatorów?
@
jest to nowy operator. Otóż to. Fakt pozostaje faktem: w Pythonie nie można definiować własnych operatorów.
$
), a następnie użyć kodu Pythona do edycji (zopen
) i zmienić wszystkoa $ b
nafunction(a,b)