Бих искал да определя собствения си оператор. 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
pipe
от toolz
. pip = Infix(lambda x,y: pipe(x,y))
. след това 8 |pip| range |pip| sum |pip| range
. изглежда работи.
- person cantdutchthis; 31.07.2015
and
.
- person Yushin Washio; 16.05.2021
Не, Python идва с предварително дефиниран, но подлежащ на замяна, набор от оператори.
dfply
използва оператор -->
: towardsdatascience.com/
- person Max Candocia; 30.04.2018
-->
, изглежда е псевдокод. Самата библиотека просто претоварва >>
.
- person Andrew Marshall; 19.10.2018
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 оставя място за различно използване на оператора за обекти, които не са подобни на масиви.
Разбира се, можете да приложите с @
всякакъв вид операция, различна от умножението на матрици, също и за обекти, подобни на масиви, но потребителското изживяване ще бъде засегнато, защото всеки ще очаква вашият тип данни да се държи по различен начин.
@
е символ на нов оператор? Или че можем по някакъв начин да го използваме, за да дефинираме нови наши собствени оператори?
- person Addem; 07.02.2016
@
е нов оператор. Това е. Фактът все още остава: не можете да дефинирате собствени оператори в Python.
- person John Red; 24.03.2016
$
) и след това да използвате някакъв код на Python, за да се редактирате (сopen
) и да промените всичкиa $ b
наfunction(a,b)
- person whackamadoodle3000   schedule 29.09.2017