假设我想在 Python 中使用类似 PERL 的自动生存,即:
>>> d = Autovivifier()
>>> d = ['nested']['key']['value']=10
>>> d
{'nested': {'key': {'value': 10}}}
有几种主要的方法可以做到这一点:
好的——简单。
现在假设我想从缺少键的字典中返回默认值。再一次,有几种方法可以做到这一点:
- 对于非嵌套路径,您可以使用
__missing__
钩子 - try/except 阻止包装对可能丢失的密钥路径的访问
- 使用
{}.get(key, default)
(不容易使用嵌套字典)即,没有版本autoviv.get(['nested']['key']['no key of this value'], default)
这两个目标似乎存在不可调和的冲突(基于我在过去几个小时试图解决这个问题。)
这是问题:
假设我想要一个 Autovivifying dict 1) 创建嵌套结构d['arbitrary']['nested']['path']
;AND 2) 从不存在的任意嵌套返回默认值,而不将其包装在 try/except 中?
以下是问题:
- 的调用
d['nested']['key']['no key of this value']
等效于(d['nested'])['key']['no key of this value']
。__getitem__
如果不返回 ALSO 覆盖的对象,则覆盖不起作用__getitem__
。 - 如果您测试该路径是否存在,那么这两种创建 Autovivifier 的方法都会创建一个 dict 条目。即,
if d['p1']['sp2']['etc.']
如果您只是使用if
.
如何在 Python 中提供一个 dict,它将:
- 创建类型的访问路径
d['p1']['p2'][etc]=val
(Autovivication); - 如果您测试是否存在,请不要创建相同的路径;
- 返回一个默认值(如
{}.get(key, default)
)而不包含在 try/except 中 - 我不需要完整的 dict 操作集。真的只有
d=['nested']['key']['value']=val
和d['nested']['key']['no key of this value']
等于一个默认值。我希望测试d['nested']['key']['no key of this value']
不会创建它,但会接受。