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

标签 python cython formatter

我知道可以扩展 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/

相关文章:

java - 使用 java.util.Formatter 作为 slf4j 的默认格式化程序

python - 将数字分配给名称而不枚举和打印基于该数字的名称

python - Pandas :按位置访问的索引更新和更改值

python - django_openid_auth TypeError openid.yadis.manager.YadisServiceManager 对象不是 JSON 可序列化的

Python:如何通过排除第三个目录来使用 tarfile 模块获取 tar

python - Cython 中的模数

python - 在 Python 中调用 C 函数

python - Cython 的计算不正确

python - 使用 python 日志记录包,如何将额外的格式插入到具有自己的格式化程序的多个记录器处理程序中?

iphone - 抓取冒号后的数字?