gpt4 book ai didi

Python/Cython 自定义格式化程序字符串表示类型

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:45 25 4
gpt4 key购买 nike

我知道可以扩展 Formatter 以提供 PEP3101 中讨论的其他表示类型,但这对于我的需求来说太慢了。我很好奇还有哪些其他选项可以用于注入(inject)字符串的自定义表示类型。

目前,想到的唯一其他选项是检查字符串的 {vars},记下表示类型和索引,剥离自定义表示类型、格式,然后根据我的需要发布结果格式。

是否有其他选项可以在利用格式化速度的同时避免后期处理?

最佳答案

我制定了一个解决方案,似乎在 cython 中的开销显着减少,尽管在 python 中也可以完成相同的操作,并且我将在此处提供示例(不确定开销)。

根据 python 文档,对象可以实现 __ format__ 方法并接收格式规范。在 cython 中,我实现了自己的 uobj 类型,它充当传递给 str.format 的 args 和 kwargs 的泛型。 python 中的相同内容(作为转义 < 和 > 的通用示例)如下所示。

class uobj:
def __init__(self, obj):
self.obj = obj
def __format__(self, format_spec):
if format_spec == 's':
return str(self.obj)
else:
# edit, shoehorning this in for completeness
# to call an original format spec as should probably
# happen after you do your own processing, use __format__
if isinstance(self.obj, (int, float)):
return self.obj.__format__(format_spec)
# so then a :.2f spec on uobj(123.456) would work as expected
return str(self.obj).replace('<', '&lt;').replace('>', '&gt;')
def __getitem__(self, key):
return uobj(self.obj[key])

现在,uobj 可以存储一个用户对象(下例中的 str 或 dict),然后可以像这样访问

d = uobj({'a': '<b>asdf'})
s = uobj('<span>qwer</span>')
'{0:s} {d[a]}'.format(s, d=d)

# ouputs: '<span>qwer</span>&lt;asdf'

向 uobj 的转换将发生在 *args 和 **kwargs 上的 fmt 函数内部。这里还有更多细节需要解决,例如我注意到 ints 在我的单元测试中无法解析,并且 uobj 需要通过 *uobj 和 **uobj 解包才能按需转换对象,尽管我可能需要将其分解为列表和字典的各自克隆。尽管如此,这对我来说似乎是最好的道路。

编辑

似乎我应该在这里阅读有关模拟容器类型的内容 http://docs.python.org/reference/datamodel.html#emulating-container-types

关于Python/Cython 自定义格式化程序字符串表示类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592249/

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