gpt4 book ai didi

python - 如何在 Python 中创建 JSON 可编码动态字符串

转载 作者:行者123 更新时间:2023-11-28 18:57:59 25 4
gpt4 key购买 nike

我想创建一个像字符串一样“运行”的对象,但当它被访问时,会触发一个函数并返回该结果。

__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 正在评估它忽略自定义 dunder 方法的对象。

我无法使用自定义 JSONEncoder,因为此对象旨在通过我无权修改的模块发送。有任何想法吗?

澄清更新:

预期输出

json.dumps(dater)
>>> '"2019-05-01T16:43:21.956985"'

即“就好像它只是一个普通的字符串,但基于当前时间”

最佳答案

这个问题似乎在于 str 类是不可变的,它从对象的初始化中获取它的值,并且不会改变。类 str__new__ 函数被调用,它接受你的 genf,然后评估为

"<function <lambda> at 0xADDRESS>"

对该实例的所有后续调用都对此字符串没有影响。要验证这一点,您可以通过覆盖 __new__ 来覆盖类定义开头的字符串:

class DynamicString(str):
def __new__(cls, genf):
o = super(DynamicString, cls).__new__(cls, "HAHA")
return o
... rest of your class ...

... rest of your script ...

# Then:
>>> json.dumps(dater)
>>> "HAHA"

似乎没有任何解决方法,因为 str 是不可变的,并且通过扩展,您的对象父字符串在实例的生命周期内也是不可变的..

关于python - 如何在 Python 中创建 JSON 可编码动态字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55936637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com