문제

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'

이 미니 언어의 구문은 아래에 있습니다. "형식 사양 미니 언어"문서에서. 시간을 절약하기 위해 내가 사용하는 문자열을 설명하겠습니다.

  1. 매개 변수 제로 (즉, 즉 19)를 사용하여 포맷해야합니다
  2. 마법 "0"0 패딩, 오른쪽 정렬 번호를 원한다는 것을 나타냅니다.
  3. 정밀도 10 자리
  4. 이진 형식.

이 구문을 사용하여 다양한 창의적인 버전의 정렬 및 패딩을 달성 할 수 있습니다.

빈 함수는 객체의 값을받습니다. __index__ 기능. 따라서 객체의 경우 바이너리로 변환 된 값을 정의 할 수 있지만 문자열의 형식을 정의 할 수는 없습니다.

BIN () 함수를 호출하려는 자신의 구현으로 재정의/교체하여 HEX 및 OCT와 동일한 동작을 달성 할 수 있습니다. 큰 상자 객체가 제공하지 않은 경우 전달되고 표준 빈 () 함수로 다시 떨어졌습니다. 큰 상자. 그러나 명시 적이 암시 적보다 낫다는 근거로, Bin ()의 사용자 정의 버전에 의존하도록 응용 프로그램을 코딩하는 것은 아마도 좋은 생각이 아니므로 기능에 다른 이름을 부여 할 수 있습니다.

def mybin(n):
    try:
        return n.__bin__()
    except AttributeError:
        return bin(n)

인터페이스의 불일치가 왜 확실하지 않습니다. 아마도 Bin ()가 최근에 추가 되었기 때문에 약간의 감독입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top