Вы можете ознакомиться с документацией str
:
Если не заданы ни кодировка, ни ошибки, str(object)
возвращает object.__str__()
, что является «неформальным» или красиво печатаемым строковым представлением объекта. Для строковых объектов это сама строка. Если объект не имеет __str__()
метода, то str()
возвращается к возвращению repr(object)
.
Это сказал. Помимо таких ситуаций, как невозможность выделить больше памяти (MemoryError
), которая не будет str
специфичной для преобразования, единственный способ увидеть этот сбой - это если кто-то перегружен __str__
(или __repr__
, если его нет *) 1019 *) и сделал это, например:
class C:
def __str__(self):
msg = "'{}' instance is not meant to be represented as str."
raise ValueError(msg.format(self.__class__))
Что приведет к:
>>> c = C()
>>> str(c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __str__
ValueError: '<class '__main__.C'>' instance is not meant to be represented as str.
Это сказало, хотя: на самом деле нет общего ответа на ваш вопрос, потому что он может поднять все, что кто-либо запрограммировал сделать.
РЕДАКТИРОВАТЬ: Все вышеперечисленное относится к простым str
вызовам с просто переданным объектом, как показано в вашем примере. Если вы попытаетесь декодировать входящий объект, указав encoding
и / или errors
. Вы можете наткнуться на TypeError
для чего-нибудь другого, кроме байтовоподобного ввода или увидеть ошибки, связанные с декодированием: UnicodeDecodeError
. Такое поведение str
описано в следующем абзаце его документов :
Если задана хотя бы одна из кодировок или ошибок, объект должен быть байтовидным объектом (например, bytes
или bytearray
). В этом случае, если объект является bytes
(или bytearray
) объектом, тогда str(bytes, encoding, errors)
эквивалентно bytes.decode(encoding, errors)
. В противном случае объект байтов, лежащий в основе объекта буфера, получается перед вызовом bytes.decode()
.