developer tip

파이썬 : 나만의 연산자 정의?

copycodes 2020. 11. 9. 08:13
반응형

파이썬 : 나만의 연산자 정의?


내 자신의 연산자를 정의하고 싶습니다. 파이썬은 그런 것을 지원합니까?


아니요, 새 연산자를 만들 수 없습니다. 그러나 표현식 만 평가하는 경우 문자열을 직접 처리하고 새 연산자의 결과를 계산할 수 있습니다.


기술적으로 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

아니요, Python에는 사전 정의되었지만 재정의 가능한 연산자 집합 이 함께 제공됩니다 .


특정 객체 클래스에 작업을 적용하려면 함수와 가장 가까운 연산자를 재정의 할 수 있습니다. 예를 들어 __eq__()재정의는 ==연산자를 재정 의하여 원하는 것을 반환합니다. 이것은 거의 모든 운영자에게 적용됩니다.


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는 배열과 유사하지 않은 객체에 대해 연산자를 다르게 사용할 수있는 공간을 남깁니다.

물론 @배열과 같은 객체에 대해서도 행렬 곱셈과 다른 모든 종류의 작업으로 구현할 수 있지만 모든 사람이 데이터 유형이 다른 방식으로 작동 할 것으로 기대하기 때문에 사용자 경험에 영향을 미칩니다.

참고 URL : https://stackoverflow.com/questions/932328/python-defining-my-own-operators

반응형