gpt4 book ai didi

python - 访问cpython字符串格式规范迷你语言解析器

转载 作者:行者123 更新时间:2023-12-04 13:23:45 25 4
gpt4 key购买 nike

编辑:

我创建了一个模块来提供此功能。它可能不是那么好,但可以得到 here .

原始问题

我需要能够解析格式字符串(由 string format specification mini language 指定)。我正在从事的一个项目大量使用了 parse用于“取消格式化”字符串的模块。该模块允许创建自定义格式代码/公式。我的意图是以某种与现有字符串格式规范迷你语言一致的方式自动解析某些类型的格式字符串。

澄清一下:“格式字符串”是指在使用 strformat 函数和 format 方法时使用的那些字符串对象,例如:

'{x!s: >5s}'.format('foo') # the format string is ' >5s'

我看过cpython string module在我看来,第 166 行好像在说格式字符串的解析是在 _string 模块中处理的。

# The overall parser is implemented in _string.formatter_parser.

这发生在这一行 (# 278):

return _string.formatter_parser(format_string)

我对 cPython 代码库很不熟悉,也不是 C 程序员,我找不到 _string 模块。我想知道它是否在C语言级别实现......?

主要问题:格式规范解析实现是否暴露在某处以供使用?我怎样才能得到它,所以我不必自己写?我希望得到这样的输出:

>>> parse_spec(' >5.2f')
{'fill': ' ', 'align': '>', 'sign': None, '#': None, '0': None, 'width': 5, ',': None, 'precision': 2, 'type': 'f'}

编辑

请注意,评论说,尽管它的名字,_string.formatter_parser 并没有做我想要的。

# returns an iterable that contains tuples of the form:
# (literal_text, field_name, format_spec, conversion)
# literal_text can be zero length
# field_name can be None, in which case there's no
# object to format and output
# if field_name is not None, it is looked up, formatted
# with format_spec and conversion and then used
def parse(self, format_string):
return _string.formatter_parser(format_string)

最佳答案

格式规范是针对每个对象的;它由 __format__() method 解析一个对象。例如,对于字符串对象,该方法在 C 中实现为 unicode__format__ function .

许多格式在对象类型之间是共享的,处理它的代码也是如此。 formatter_unicode.c file处理大多数格式字符串解析。在此文件中,parse_internal_render_format_spec() function进行大部分解析。

不幸的是,这个函数没有暴露给 Python 代码。此外,它被声明为 static,因此您也无法从外部访问它(例如,通过 ctypes wrapper )。您唯一的选择是重新实现它,或者使用从函数中删除的 static 关键字重新编译您的 Python 源代码,然后通过共享库访问它。

关于python - 访问cpython字符串格式规范迷你语言解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44551535/

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