내 자신의 연산자를 정의하고 싶습니다. 파이썬은 그런 것을 지원합니까?
답변:
기술적으로는 파이썬에서 새로운 연산자를 정의 할 수 없지만이 영리한 해킹 은이 제한을 우회합니다. 다음과 같이 중위 연산자를 정의 할 수 있습니다.
# 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
from toolz
. pip = Infix(lambda x,y: pipe(x,y))
. 그런 다음 8 |pip| range |pip| sum |pip| range
. 작동하는 것 같습니다.
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는 배열과 유사하지 않은 객체에 대해 연산자를 다르게 사용할 수있는 공간을 남깁니다.
물론 @
배열과 같은 객체에 대해서도 행렬 곱셈과 다른 모든 종류의 작업으로 구현할 수 있지만 모든 사람이 데이터 유형이 다른 방식으로 작동 할 것으로 기대하기 때문에 사용자 경험에 영향을 미칩니다.
@
새로운 연산자 기호 라는 뜻 입니까? 아니면 우리 자신의 새로운 연산자를 정의하는 데 어떻게 든 사용할 수 있습니까?
@
새로운 연산자 라는 것을 의미했습니다 . 그게 다야. 사실은 여전히 남아 있습니다. Python에서 자신의 연산자를 정의 할 수 없습니다.
$
) 다음 (과 편집 자체에 약간의 파이썬 코드를 사용합니다open
) 모든 변경a $ b
에function(a,b)