Python: определение моих собственных операторов?
Я хотел бы определить свой собственный оператор. Поддерживает ли python такую вещь?
6 ответов:
нет, вы не можете создавать новые операторы. Однако, если вы просто оцениваете выражения, вы можете обработать строку самостоятельно и вычислить результаты новых операторов.
хотя технически вы не можете определить новые операторы в Python, это умный Хак работы вокруг этого ограничения. Это позволяет определить операторы инфикса следующим образом:
# 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
нет, Python поставляется с предопределенным, но переопределяемым,набор операторов.
Если вы собираетесь применить операцию к определенному классу объектов, вы можете просто переопределить оператор, который соответствует вашей функции ближе всего... например, переопределение
__eq__()
переопределяет==
оператора, чтобы вернуть все, что вы хотите. Это работает практически для всех операторов.
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 и это улучшение отслеживания билетов для получения дополнительной информации.
в Python 3.5 вводит символ
@
для дополнительного оператора.PEP465 введен этот новый оператор для умножения матрицы, чтобы упростить обозначение многих числовых кодов. Оператор будет реализован не для всех типов, а только для массивов-подобных-объектов.
вы можете поддерживать оператор для ваших классов / объектов, реализуя
__matmul__()
.PEP оставляет место для другого использования оператора для не-массивов-подобных объекты.
конечно, вы можете реализовать с помощью
@
любая операция, отличная от умножения матрицы, также для массивов, подобных объектам, но на пользовательский опыт будет влиять, потому что все будут ожидать, что ваш тип данных будет вести себя по-другому.