[python] Python TypeError : object .__ format__에 전달 된 비어 있지 않은 형식 문자열

최근에이 TypeError 예외가 발생하여 디버그하기가 매우 어려웠습니다. 결국 나는 이것을이 작은 테스트 케이스로 줄였습니다.

>>> "{:20}".format(b"hi")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

어쨌든 이것은 나에게 매우 명확하지 않습니다. 내 코드의 해결 방법은 바이트 문자열을 유니 코드로 디코딩하는 것입니다.

 >>> "{:20}".format(b"hi".decode("ascii"))
 'hi                  '

이 예외의 의미는 무엇입니까? 더 명확하게 할 수있는 방법이 있습니까?



답변

bytes객체에는 __format__자체 메서드가 없으므로 기본값 from object이 사용됩니다.

>>> bytes.__format__ is object.__format__
True
>>> '{:20}'.format(object())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

그것은 단지 당신이 이것들에 똑바로, 정렬되지 않은 비 정렬 포맷 이외의 것을 사용할 수 없다는 것을 의미합니다. (당신은 디코딩에 의해처럼 명시 적으로 문자열 객체로 변환 bytesstr얻을 수) 형식 사양을 지원 .

!s문자열 변환 을 사용하여 명시 적으로 변환 할 수 있습니다 .

>>> '{!s:20s}'.format(b"Hi")
"b'Hi'               "
>>> '{!s:20s}'.format(object())
'<object object at 0x1100b9080>'

object.__format__ 암시 적 문자열 변환을 방지하기 위해 형식 문자열을 명시 적으로 거부합니다. 특히 형식 지정 명령어는 유형에 따라 다릅니다.


답변

형식을 지정하려고 할 때도 발생합니다 None.

>>> '{:.0f}'.format(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

해결하는 데 시간이 걸렸습니다 (제 경우 None에는 인스턴스 변수가 반환 했을 때 )!


답변