Я хотел бы определить своего оператора. Поддерживает ли Python такое?
Ответы:
Хотя технически вы не можете определять новые операторы в 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
pipeот toolz. pip = Infix(lambda x,y: pipe(x,y)). тогда 8 |pip| range |pip| sum |pip| range. вроде работает.
Нет, Python поставляется с предопределенным, но переопределяемым набором операторов .
-->похоже, псевдокод. Сама библиотека просто перегружается >>.
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 и этот билет отслеживания улучшений для получения дополнительной информации.
Если вы намереваетесь применить операцию к определенному классу объектов, вы можете просто переопределить ближайший к вашей функции оператор ... например, переопределение __eq__()переопределит ==оператор и вернет все, что вы хотите. Это работает практически для всех операторов.
Python 3.5 вводит символ @для дополнительного оператора.
PEP465 представил этот новый оператор для матричного умножения, чтобы упростить запись многих числовых кодов. Оператор будет реализован не для всех типов, а только для объектов, подобных массивам.
Вы можете поддержать оператор для своих классов / объектов, реализовав __matmul__().
PEP оставляет место для другого использования оператора для объектов, не похожих на массивы.
Конечно, вы можете реализовать @любую операцию, отличную от умножения матриц, также для объектов, подобных массивам, но это повлияет на взаимодействие с пользователем, потому что все будут ожидать, что ваш тип данных будет вести себя по-другому.
@это новый символ оператора? Или что мы можем как-то использовать его для определения новых собственных операторов?
@это новый оператор. Вот и все. Факт остается фактом: в Python нельзя определять собственные операторы.
$), а затем использовать некоторый код Python для редактирования самого себя (сopen) и изменения всегоa $ bнаfunction(a,b)