Python: определение моих собственных операторов?

Я хотел бы определить моего собственного оператора. Поддерживает ли python такую ​​вещь?

Ответ 1

Нет, вы не можете создавать новые операторы. Однако, если вы просто оцениваете выражения, вы можете сами обрабатывать строку и вычислять результаты новых операторов.

Ответ 2

В то время как технически вы не можете определить новые операторы в Python, этот умный взлом работает вокруг этого ограничения. Это позволяет вам определять операторы infix, подобные этому:

# 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

Ответ 4

Если вы намерены применить операцию к определенному классу объектов, вы можете просто переопределить оператор, который соответствует вашей функции, ближайший... например, переопределение __eq__() переопределит оператор ==, чтобы вернуть все, что вы хотеть. Это работает практически для всех операторов.

Ответ 5

Sage предоставляет эту функциональность, в основном используя "умный хак", описанный @Ayman Hourieh, но встроенный в модуль в качестве декоратора, чтобы обеспечить более чистый внешний вид и дополнительную функциональность - вы можете выбрать оператора для перегрузки и, следовательно, порядок оценка.

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

Подробнее см. документацию Sage и этот билет для отслеживания улучшений.

Ответ 6

Python 3.5 вводит символ @ для дополнительного оператора.

PEP465 представила этот новый оператор для матричного умножения, чтобы упростить обозначение многих числовых кодов. Оператор не будет реализован для всех типов, но только для объектов, подобных массивам.

Вы можете поддерживать оператора для своих классов/объектов, реализуя __matmul__().

PEP оставляет пространство для другого использования оператора для объектов, не связанных с массивами.

Конечно, вы можете реализовать с помощью @ любой операции, отличной от матричного умножения, и для объектов, подобных массивам, но это повлияет на работу пользователя, потому что все будут ожидать, что ваш тип данных будет вести себя по-другому.