Я хочу создать объект, который «действует» как строка, но при доступе к нему запускает функцию и возвращает этот результат.
Простой случай для __str__
и __repr__
достаточно прост; но я не могу понять, как заставить json.dumps
обращаться с ним таким же образом;
import json, datetime
class DynamicString(str):
def __init__(self, genf):
self.generate = genf
def __repr__(self):
print("Called Repr")
return self.generate()
def __str__(self):
print("Called Str")
return self.generate()
dater=DynamicString(lambda: datetime.datetime.now().isoformat())
print(f"{dater!s}, {dater!r}, {dater!a}")
>>> Called Str
>>> Called Repr
>>> Called Repr
>>> 2019-05-01T13:52:12.588907, 2019-05-01T13:52:12.588933, 2019-05-01T13:52:12.588950
print(json.dumps(dater))
>>> "<function <lambda> at 0x10bb48730>"
Похоже, что json.dumps
оценивает объект, игнорируя пользовательские методы обработки данных.
Я не могу использовать пользовательский JSONEncoder
, так как этот объект предназначен для отправки через модули, к которым у меня нет прав на изменение. Есть идеи?
ОБНОВЛЕНИЕ ДЛЯ ЯСНОСТИ:
Ожидаемый результат
json.dumps(dater)
>>> '"2019-05-01T16:43:21.956985"'
т.е. «Точно так же, как если бы это была обычная строка, но основанная на текущем времени»