如何从Python格式字符串中提取关键字?
我想在API中提供自动字符串格式,例如:
my_api("path/to/{self.category}/{self.name}", ...)
可以替换为格式化字符串中标注的属性值。
如何从Python格式字符串中提取关键字参数:
"non-keyword {keyword1} {{escaped brackets}} {} {keyword2}" => 'keyword1', 'keyword2'
-
您可以使用
string.Formatter()
类的一个字符串,解析出的领域,与Formatter.parse()
方法: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)(此内部实现细节未公开;Formatter.get_field()
在内部使用)。此函数返回名称的
第一部分 ,将在传递给的参数中查找该名称的 第一部分str.format()
,并为该字段的其余部分生成一个生成器。生成器产生
(is_attribute, name)
元组;is_attribute
如果将姓氏视为属性,则为true;如果要使用以下项查找,则为falseobj[name]
: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实现中也不可用。