from string import Formatter
fieldnames = [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]
演示:>>> from string import Formatter
>>> yourstring = "path/to/{self.category}/{self.name}"
>>> [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]
['self.category', 'self.name']
>>> yourstring = "non-keyword {keyword1} {{escaped brackets}} {} {keyword2}"
>>> [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]
['keyword1', 'keyword2']
您可以进一步解析这些字段名;为此,您可以使用str._formatter_field_name_split()方法(Python 2)/_string.formatter_field_name_split()函数(Python 3)(此内部实现细节不会公开;^{}在内部使用它)。此函数返回名称的第一部分,即在传递给str.format()的参数中查找的部分,以及字段其余部分的生成器。
生成器生成(is_attribute, name)元组;is_attribute如果要将下一个名称视为属性,则为true;如果要使用obj[name]查找项,则为false:try:
# Python 3
from _string import formatter_field_name_split
except ImportError:
formatter_field_name_split = str._formatter_field_name_split
from string import Formatter
field_references = {formatter_field_name_split(fname)[0]
for _, fname, _, _ in Formatter().parse(yourstring) if fname}
演示:>>> from string import Formatter
>>> from _string import formatter_field_name_split
>>> yourstring = "path/to/{self.category}/{self.name}"
>>> {formatter_field_name_split(fname)[0]
... for _, fname, _, _ in Formatter().parse(yourstring) if fname}
{'self'}
考虑到此函数是Formatter()类的内部实现细节的一部分,可以在不通知的情况下从Python中更改或删除,甚至在其他Python实现中都可能不可用。