为了回答这个问题,你需要定义“优雅”.有几个因素值得考虑:
>代码是否简短,易于记忆,易于编写和自我解释?
>它是否重用了基础逻辑(即遵循DRY原则)?
>它是否实现了完全相同的解析逻辑?
不幸的是,字符串的“%”格式是在stringobject.c中的C例程“PyString_Format”中实现的.此例程不提供允许访问格式字符串的已解析形式的API或挂钩.它只是在解析格式字符串时构建结果.因此,任何解决方案都需要从C例程复制解析逻辑.这意味着如果对格式规范进行了更改,则不会遵循DRY并公开任何解决方案.
PyString_Format中的解析算法包含一些复杂性,包括处理键名中的嵌套括号,因此无法使用正则表达式完全实现,也不能使用字符串“split()”.没有从PyString_Format复制C代码并将其转换为Python代码,我没有看到在任何情况下正确提取映射键名称的任何远程简单方法.
所以我的结论是没有“优雅”的方法来获取Python 2.7“%”格式字符串的映射键的名称.
以下代码使用正则表达式提供涵盖最常见用法的部分解决方案:
import re
class StringFormattingParser(object):
__matcher = re.compile(r'(?
@classmethod
def getKeyNames(klass, formatString):
return klass.__matcher.findall(formatString)
# Demonstration of use with some sample format strings
for value in [
'%(a)s and %(b)s are friends.',
'%%(nomatch)i',
'%%',
'Another %(matched)+4.5f%d%% example',
'(%(should_match(but does not))s',
]:
print StringFormattingParser.getKeyNames(value)
# Note the following prints out "really does match"!
print '%(should_match(but does not))s' % {'should_match(but does not)': 'really does match'}