Python 2.6에서 bin ()가 Oct () 및 Hex ()처럼 과부하 될 수 있습니까?
-
05-07-2019 - |
문제
Python 2.6 (및 이전)에서 hex()
그리고 oct()
내장 함수는 클래스에서 정의하여 과부하 할 수 있습니다. __hex__
그리고 __oct__
특별한 기능. 그러나 A는 없습니다 __bin__
Python 2.6의 새로운 동작을 과부하하기위한 특수 기능 bin()
내장 기능.
유연하게 과부하의 방법이 있는지 알고 싶습니다. bin()
, 그리고 그렇지 않다면 왜 일관성이없는 인터페이스가 궁금하십니까?
나는 그것을 알고있다 __index__
특수 기능을 사용할 수 있지만 정수 만 반환 할 수 있으므로 유연하지 않습니다. 내 특별한 사용 사례는 다음과 같습니다 비트 스트링 주요 제로 비트가 중요한 것으로 간주되는 모듈 :
>>> a = BitString(length=12) # Twelve zero bits
>>> hex(a)
'0x000'
>>> oct(a)
'0o0000'
>>> bin(a)
'0b0' <------ I want it to output '0b000000000000'
나는 이것을 달성 할 방법이 없다고 생각하지만, 나는 그것이 아프지 않을 것이라고 생각했다!
해결책 2
짧은 대답은 '아니요, bin()
과부하 할 수 없습니다 oct()
그리고 hex()
.'
왜 대답은 Python 3.0과 함께 있어야합니다. __index__
과부하 hex()
, oct()
그리고 bin()
, 그리고 그것을 제거했다 __oct__
그리고 __hex__
특별한 기능.
그래서 파이썬 2.6 bin()
오래된 Python 2 웨이보다는 새로운 Python 3 Way를 수행하고 있다는 것을 많이 고려하지 않고 Python 3.0 기능이 실제로 백 포트 된 기능인 것처럼 보입니다. 또한 버그로 간주 되더라도 고정되지 않을 것 같아요.
다른 팁
이미 발견 한 것처럼 무시할 수 없습니다 bin()
, 그러나 그것은 당신이 그렇게해야 할 것 같지 않습니다. 당신은 단지 0 패딩 바이너리 값을 원합니다. 불행히도 Python 2.5 및 이전에서는 "%B"를 사용하여 이진을 표시 할 수 없었으므로 "%"문자열 서식 연산자를 사용하여 원하는 결과를 달성 할 수 없습니다.
운 좋게도 Python 2.6은 새로운 형태로 원하는 것을 제공합니다. str.format () 방법. 나는이 특별한 라인 잡음이 당신이 찾고있는 것이라고 생각합니다.
>>> '{0:010b}'.format(19)
'0000010011'
이 미니 언어의 구문은 아래에 있습니다. "형식 사양 미니 언어"문서에서. 시간을 절약하기 위해 내가 사용하는 문자열을 설명하겠습니다.
- 매개 변수 제로 (즉, 즉
19
)를 사용하여 포맷해야합니다 - 마법 "
0
"0 패딩, 오른쪽 정렬 번호를 원한다는 것을 나타냅니다. - 정밀도 10 자리
- 이진 형식.
이 구문을 사용하여 다양한 창의적인 버전의 정렬 및 패딩을 달성 할 수 있습니다.
빈 함수는 객체의 값을받습니다. __index__
기능. 따라서 객체의 경우 바이너리로 변환 된 값을 정의 할 수 있지만 문자열의 형식을 정의 할 수는 없습니다.
BIN () 함수를 호출하려는 자신의 구현으로 재정의/교체하여 HEX 및 OCT와 동일한 동작을 달성 할 수 있습니다. 큰 상자 객체가 제공하지 않은 경우 전달되고 표준 빈 () 함수로 다시 떨어졌습니다. 큰 상자. 그러나 명시 적이 암시 적보다 낫다는 근거로, Bin ()의 사용자 정의 버전에 의존하도록 응용 프로그램을 코딩하는 것은 아마도 좋은 생각이 아니므로 기능에 다른 이름을 부여 할 수 있습니다.
def mybin(n):
try:
return n.__bin__()
except AttributeError:
return bin(n)
인터페이스의 불일치가 왜 확실하지 않습니다. 아마도 Bin ()가 최근에 추가 되었기 때문에 약간의 감독입니까?