최근에이 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__
그것은 단지 당신이 이것들에 똑바로, 정렬되지 않은 비 정렬 포맷 이외의 것을 사용할 수 없다는 것을 의미합니다. (당신은 디코딩에 의해처럼 명시 적으로 문자열 객체로 변환 bytes
을 str
얻을 수) 형식 사양을 지원 .
!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
에는 인스턴스 변수가 반환 했을 때 )!