Aym*_*man 5 python templates string-formatting
我有一个复杂的嵌套 dict 对象,例如:
value = {
'a': '100',
bits: {
1: 'alpha',
2: 'beta',
3: ['31', '32', 901]
}
}
Run Code Online (Sandbox Code Playgroud)
我需要使用模板“安全”地格式化它。这意味着如果找不到键,则只需默默地忽略{}占位符即可。键可能不存在,并且我不想引发 KeyErrors。问题是 string.Template 无法处理与 str.format 相同的功能。我使用的 str.format 是这样的:
"a=${a}, b1={bits[1]}, b31={bits[3]}, b9={bits[9]}".format(**value)
Run Code Online (Sandbox Code Playgroud)
输出应该是:
"a=100, b1=alpha, b31=(31, 32, 901), b9="
Run Code Online (Sandbox Code Playgroud)
我不需要花哨的循环或 if/else 条件。只是带有子字典的简单格式。
我有哪些选择?我更喜欢尽可能多地使用内置函数或非常小的库。
这不是一个网络应用程序,所以如果可能的话我想避免为此加载像 jinja2 这样的库。
编写您自己的格式化程序:
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="
Run Code Online (Sandbox Code Playgroud)
对于Python 3,您需要添加
import _string
Run Code Online (Sandbox Code Playgroud)
并更换线路
first, rest = field_name._formatter_field_name_split()
Run Code Online (Sandbox Code Playgroud)
和
first, rest = _string.formatter_field_name_split(field_name)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1954 次 |
| 最近记录: |