Я хотів би визначити власного оператора. Чи підтримує 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)