2016-09-28 3 views
3
>>> a = 55 
>>> b = "hello" 
>>> ~a # this will work 
>>> ~b # this will fail 

위의 실패에 대한 놀라운 사실은 없지만 문자열에서 작업 할 때 ~ 연산자를 과부하하고 싶다고 가정 해 보겠습니다. 저는 파이썬을 처음 접해 보았습니다. 그래서 이것에 대해 조사해 보았습니다. 그리고 나는 단지 일할 수 없었던 약간의 제안을 발견했습니다. 나는 어떤 종류의 새로운 수업을 만들 수 있다는 것을 알고 있지만, 다음과 같이 잘 작동하고 싶습니다.문자열에 ~ 연산자를 오버로드 할 수 있습니까?

>>> ~"alpha bravo" 

이것이 가능합니까? 그렇다면 어떻게? 어떻게 이러한 종류의 과부하를합니까?

+0

부지런한 사람이라면 코드를 구문 분석하고 필요에 따라 AST를 수정하는 프런트 엔드를 작성할 수 있습니다. –

+0

정확히 '~'알파 브라보가 어떻게 할 것으로 기대합니까? 아마도 당신이 원하는대로 작동 할 수있는 다른 데이터 구조 (문자열이 아닌)가 있을까요? – Blckknght

+0

저는 C#에 대한 최근 변경 사항을 PHP에서 가져 왔으며 (아마 다른 곳에서 가져온 것임) 문자열에 변수를 포함하고 있습니다. 그것이 나에게 떠올랐다면'myformat ("당신은 벽에 {맥주}를 가지고 있습니다.")를 상당히 쉽게 구현할 수있었습니다. "그런 다음 나는 정신적 인 도약을 취하여"~에 벽에 맥주가있다 "고 생각했습니다. 이것들은 언어에 대해 더 많이 배우려고 할 때 생각하는 것들입니다. – Argle

답변

1

아니요, 이것은 Python에서는 불가능합니다. 신뢰할 수있는 방식으로 내장 메서드에 새 메서드를 추가 할 수 없습니다.

당신이 할 수있는 한 가지는 하위 클래스 문자열이며, 마법 방법 __invert__을 정의하십시오. 그러나 문자열 리터럴에서는 작동하지 않으며 하위 클래스의 인스턴스에서만 작동합니다.

+1

'forbiddenfruit'은 작동하지 않습니다 (나는 여전히 충고하지 않습니다 ...)? –

+1

'forbiddenfruit'는 당신에게 끔찍한 해킹이있는 메소드를 추가 할 수 있지만 직접 호출 할 때만 연산자를 통해 작동하지 않습니다. – wim

+0

이것은 물론 실망 스럽습니다. 나는 그것이 가능하지 않다고 생각했지만, 나는 확실히 알지 못했다. 나는 조금 더 많은 경험을 가진 사람들에게 물어볼 가치가 있다고 생각했다. 위 내 메모를 참조하십시오. 어쩌면 미래의 언어 기능으로 제안할만한 가치가있을 것입니다. 이 출력 형식 지정 원칙은 다른 언어 개발자에게는 손실되지 않았습니다. – Argle

관련 문제