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


78

최근에이 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                  '

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


7
아마 주목할 가치가 있습니다. 이것은 TypeErrorPython 3.4+ 에서만되었으며, 그 과정에서 object정의하지 않고 상속하는 모든 것에 영향을 미칩니다 __format__(예 : None; class T(object): pass등).
Henry Keiter 2014

1
배경 정보를 참조 bugs.python.org/issue7994
리트

2
나도이 문제가 있었고 마침내 float를 포함 해야하는 변수가 실제로 None. 따라서이 '{0:.4f}'.format(bla)예외가 발생했습니다
SomethingSomething

답변:


77

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__ 암시 적 문자열 변환을 방지하기 위해 형식 문자열을 명시 적으로 거부합니다. 특히 형식 지정 명령어는 유형에 따라 다릅니다.


11
감사합니다! 그래도 오류가 더 직관적 이길 바랍니다!
Chris AtLee 2014-06-12

27

형식을 지정하려고 할 때도 발생합니다 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에는 인스턴스 변수가 반환 했을 때 )!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.