какую ошибку вносит str, когда не может справиться с преобразованием? - PullRequest
0 голосов
/ 17 сентября 2018

Я пишу своего рода «универсальный» json-декодер, который конвертирует все, что может, используя json-кодировщик по умолчанию, плюс наборы, и все остальное, что он преобразует, используя str() - что немного глупо, но это позволит просто работайте тихо и дайте пользователям знать, какие данные были изначально.

Таким образом, с небольшой поправкой следующий код взят из здесь :

import json
class SetEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, set):
            return list(obj)
        try:
            return json.JSONEncoder.default(self, obj)
        except TypeError:
            return str(obj)

Тогда, если я попытаюсь преобразовать функцию с использованием этого кодировщика, она вернет что-то вроде:

'<function a at 0x10ddd8f28>'

Что, опять-таки, немного глупо, но вполне подходит для моих целей.

Вопрос: что если str() не сможет преобразовать что-либо, предоставленное в качестве входного аргумента? Какая ошибка будет вызвана? Я просмотрел str источник и не понял, когда именно (если вообще?) Он фиксирует возможные ошибки преобразования. Или предполагается преобразовать любой вход при условии?

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете ознакомиться с документацией 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().

...