2009-06-16 2 views
12

파이썬 2.6 (및 그 이전 버전)에서 및 __oct__ 특수 기능을 정의하여 클래스에서 내장형 함수 hex()oct()을 오버로드 할 수 있습니다. 그러나 파이썬 2.6의 새로운 bin() 내장 함수의 동작을 오버로드하는 특수 함수는 __bin__이 아닙니다.Python 2.6에서 bin()을 oct() 및 hex()처럼 오버로드 할 수 있습니까?

bin()을 유연하게 오버로드 할 수있는 방법이 있는지 알고 싶습니다. 왜 일관성이없는 인터페이스인지 궁금합니다.

__index__ 특수 기능을 사용할 수 있다는 것을 알고 있지만 이것은 정수만 반환 할 수 있으므로 유연하지 않습니다. 내 특정 유스 케이스 제로 비트가 중요한 고려 이어지는 bitstring 모듈에서이다 :

>>> a = BitString(length=12)  # Twelve zero bits 
>>> hex(a) 
'0x000' 
>>> oct(a) 
'0o0000' 
>>> bin(a) 
'0b0' <------ I want it to output '0b000000000000' 

나는이 달성의 방법이 없다고 생각하지만, 나는 그것을 물어 해치지 않을 것이라고 생각!

답변

4

짧은 대답은 '아니오, bin()oct()hex()처럼 오버로드 할 수 없습니다.' 대답은 hex(), oct()bin()을, 과부하 __index__을 사용하여 파이썬 3.0을 (를) 다음과 함께 거짓말을해야 전부 __oct____hex__ 특수 기능을 제거했습니다 이유에 관해서는

.

그래서 파이썬 2.6 bin()은 파이썬 3.0의 기능과 매우 흡사하게 보입니다. 파이썬 3.0의 기능은 이전의 파이썬 2 방식보다 새로운 파이썬 3 방식을 사용하고 있다는 점을 고려하지 않고 다시 이식되었습니다. 또한 버그로 간주 되더라도 수정 될 가능성은 희박합니다.

1

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

0

을 호출하려고 시도한 사용자 고유의 구현으로 bin() 함수를 재정 의하여/대체하여 16 진수 및 8 진수와 동일한 동작을 얻을 수 있습니다.이 객체는 전달 된 후 표준 빈) 함수는 bin을 제공하지 않은 경우 작동합니다. 그러나 명시 적으로 묵시적보다 낫다면, bin()의 사용자 정의 버전에 의존하도록 응용 프로그램을 코딩하는 것은 좋은 생각이 아니므로 함수에 다른 이름을 부여하십시오.

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

인터페이스의 불일치에 대해서는 확실하지 않습니다. bin()이 최근에 추가되어 약간의 감독이 있었기 때문에 그럴 수도 있습니다.

11

이미 발견 했으므로 bin()을 무시할 수는 없지만 그렇게해야 할 필요는 없습니다. 방금 0으로 채워진 이진 값이 필요합니다. 불행히도 파이썬 2.5 및 이전 버전에서는 "% b"를 사용하여 바이너리를 나타낼 수 없으므로 "%"문자열 형식 지정 연산자를 사용하여 원하는 결과를 얻을 수 없습니다.

운 좋게 python 2.6은 새로운 str.format() 메서드의 형태로 원하는 것을 제공합니다. 나는 라인 잡음이 특정 비트가 당신이 찾고있는 무엇이라고 생각 :

>>> '{0:010b}'.format(19) 
'0000010011' 

이 미니 언어에 대한 구문은 문서에서 "format specification mini-language"을 받고있다. 당신에게 시간을 절약하기 위해, 내가 사용하고 문자열 설명 할 것이다 :

  1. 매개 변수를 제로 (즉 19)는
  2. 마법 "0"나는 0- 원하는 것을 나타 내기 위해서 (때문에) 사용하여 포맷해야합니다 숫자가 오른쪽으로 패딩되고 오른쪽으로 정렬 된 숫자는
  3. 10 자리의 정밀도로
  4. 바이너리 형식입니다.

이 구문을 사용하여 다양한 맞춤 및 패딩 버전을 만들 수 있습니다.

+0

감사합니다. 알아두면 유용합니다. 나는 이미 원했던 형태로 출력물을 얻을 수 있었지만, bin 함수를 돌려받지 못했습니다. str.format 메서드는 내가 사용한 메서드보다 훨씬 간결합니다! –

+0

참조 http://stackoverflow.com/questions/3258330/converting-from-hex-to-binary-without-losing-leading-0s-python – endolith

관련 문제