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


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

6 53

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 оставляет место для другого использования оператора для не-массивов-подобных объекты.

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