繁体   English   中英

用于嵌套dict对象的Python安全字符串模板

[英]Python Safe string templates for nested dict object

我有一个复杂的嵌套dict对象,例如:

value = { 
    'a': '100', 
    bits: {
        1: 'alpha', 
        2: 'beta', 
        3: ['31', '32', 901]
    }
}

我需要使用模板“安全”格式化它。 意思是如果找不到钥匙,只要默默地忽略{}占位符。 密钥可能不存在,我不想提出KeyErrors。 问题是string.Template无法处理与str.format相同的功能。 我使用的str.format是这样的:

"a=${a}, b1={bits[1]}, b31={bits[3]}, b9={bits[9]}".format(**value)

输出应该是:

"a=100, b1=alpha, b31=(31, 32, 901), b9="

我不需要花哨的循环或if / else条件。 只是简单的格式与sub dicts。

我有哪些选择? 我更喜欢尽可能使用内置函数或使用非常小的库。

这不是一个Web应用程序,所以如果可能的话,我想避免为此加载像jinja2这样的lib。

写你自己的格式化程序:

In [1]: from string import Formatter

In [2]: value = { 
   ...:     'a': '100', 
   ...:     'bits': {
   ...:         1: 'alpha', 
   ...:         2: 'beta', 
   ...:         3: ['31', '32', 901]}}

In [3]: class YourFormatter(Formatter):
   ...:     def get_value(self, field_name, args, kwargs):
   ...:         return kwargs.get(field_name, '')
   ...: 
   ...:     def get_field(self, field_name, args, kwargs):
   ...:         first, rest = field_name._formatter_field_name_split() 
   ...:         obj = self.get_value(first, args, kwargs) 
   ...:         
   ...:         for is_attr, i in rest:
   ...:             if is_attr:
   ...:                 obj = getattr(obj, i)
   ...:             else:
   ...:                 obj = obj.get(i, '')
   ...:         return obj, first
   ...:     


In [4]: fmt = YourFormatter()

In [5]: fmt.format("a={a}, b1={bits[1]}, b31={bits[3]}, b9={bits[9]}", **value)
Out[5]: "a=100, b1=alpha, b31=['31', '32', 901], b9="

对于Python 3,您需要添加

import _string

并更换线

first, rest = field_name._formatter_field_name_split() 

first, rest = _string.formatter_field_name_split(field_name) 

执行此操作的唯一方法是编写实现dict和序列协议的包装类,将任何列表或dict返回值包装在同一个类中,并捕获任何KeyError或IndexError异常。

然后你的调用变成"…".format(**DefaultingWrapper(value))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM