내 자신의 연산자를 정의하고 싶습니다. 파이썬은 그런 것을 지원합니까?
답변
아니요, 새 연산자를 만들 수 없습니다. 그러나 표현식 만 평가하는 경우 문자열을 직접 처리하고 새 연산자의 결과를 계산할 수 있습니다.
답변
기술적으로는 파이썬에서 새로운 연산자를 정의 할 수 없지만이 영리한 해킹 은이 제한을 우회합니다. 다음과 같이 중위 연산자를 정의 할 수 있습니다.
# 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에는 사전 정의되었지만 재정의 가능한 연산자 집합 이 함께 제공됩니다 .
답변
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는 배열과 유사하지 않은 객체에 대해 연산자를 다르게 사용할 수있는 공간을 남깁니다.
물론 @
배열과 같은 객체에 대해서도 행렬 곱셈과 다른 모든 종류의 작업으로 구현할 수 있지만 모든 사람이 데이터 유형이 다른 방식으로 작동 할 것으로 기대하기 때문에 사용자 경험에 영향을 미칩니다.