我发现这是一个难以理解的问题,因此就是例子。但是,我基本上被赋予arbitrary format strings,我需要(有效地)从数据库中获取适当的值,以便动态地构建相关的映射对象。
给定一个期望映射对象的格式字符串,例如:
>>> 'Hello, %(first-name)s!' % {'first-name': 'Dolph'}
'Hello, Dolph!'
我正在寻找下面的'infer_field_names()'的实现:
>>> infer_field_names('Hello, %(first-name)s! You are #%(customer-number)d.')
['first-name', 'customer-number']
我知道我可以编写正则表达式(甚至尝试解析异常消息!),但我希望现有的API调用可以用来代替..?
基于string Formatter docs,我认为这样可行:
>>> import string
>>> format_string = 'Hello, %(first-name)s! You are #%(customer-number)d.'
>>> [x[1] for x in string.Formatter().parse(format_string)]
[None]
但这并没有完全回复我所期望的(按照文档列出的field_name
s。)
答案 0 :(得分:6)
当使用%
运算符格式化字符串时,右操作数不必是字典 - 它只需要是一些对象,将所需的字段名称映射到应该被替换的值。所以你需要做的就是编写一个带有重新定义的__getitem__()
的类,它从数据库中检索值。
这是一个毫无意义的例子:
class Mapper(object):
def __getitem__(self, item):
return item
print 'Hello, %(first-name)s!' % Mapper()
打印
Hello, first-name!