gpt4 book ai didi

python - 如何使 Glom 与类似 dict 的对象一起工作

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:51 25 4
gpt4 key购买 nike

Glom ( https://glom.readthedocs.io/en/latest/ ) 除其他外,还用于

path-based access for nested structures

但是如何让它适用于字典之外的嵌套结构?

考虑以下类(为了简单起见,故意不是实际的collection.abc.Mapping:

class MyMap: 
def __init__(self, d):
self.d = d
def __getitem__(self, k):
"""just delegating"""
v = self.d[k]
if isinstance(v, (dict, MyMap)):
return MyMap(v)
else:
return v

这有效:

m = MyMap({'a': {'b': {'c': 'd'}}})
assert m['a']['b']['c'] == 'd'

但这不是:

from glom import glom
assert glom(m, 'a.b.c') == 'd'

我收到错误:PathAccessError:无法访问“a”,路径的第 0 部分(“a”、“b”、“c”),出现错误:AttributeError(““MyMap”对象没有属性“a””)

更具体地说,如何指定:

  • 什么是节点(即可以进一步隐藏的对象)
  • 键迭代器(如何将路径拆分为键)
  • 项目 getter (如何从键检索数据)

如果它有帮助,这是我正在寻找 glom 来满足的功能:

dot_str_key_iterator = lambda p: p.split('.')
bracket_getter = lambda obj, k: obj[k]

def simple_glom(target, spec,
node_types=(dict,),
key_iterator=dot_str_key_iterator,
item_getter=bracket_getter
):
for k in key_iterator(spec):
target = item_getter(target, k)
if not isinstance(target, node_types):
break
return target

这个函数没有所有的花哨功能,但允许我做:

m = MyMap({'a': {'b': {'c': 'd'}}})
simple_glom(m, 'a.b.c', node_types=(MyMap,))

或者使用所有参数的极端示例:

from types import FunctionType
from functools import partial

attr_glom = partial(simple_glom,
node_types=(FunctionType, type),
key_iterator=lambda p: p.split('/'),
item_getter=getattr)
assert attr_glom(MyMap, '__getitem__/__doc__') == 'just delegating'

最佳答案

这些都是很好的问题!我会尽力一次将它们分解出来:

如何指定一个对象可以被glommed?

当你在这里说“glom”时,我假设你的意思是“访问”。

Python 具有非常丰富的数据模型,虽然在每种情况下“访问”通常都有直观的含义,但猜测起来可能成本高昂且存在风险。 glom 的解决方法是 provide explicit registration APIs .

如何指定键迭代器?

如果您想分割路径(例如,glom(target, 'a.b.c')'a.b.c')进入用于访问该路径的结构化键(和操作),我建议查看 the Path type ,具体来说,Path.from_text()path.items()

如果您想查看一个对象并确定该对象内存在哪些路径,那就更棘手了。

在撰写本文时,glom 仍然主要设计用于访问和构建已知结构,并提供一些默认/分支的功能。对于所有可能路径的完全上下文无关迭代,目前我必须提供的最好的是 remap (cookbook)。请注意,remap 没有 glom 的插件/注册功能,但它确实可以开箱即用地迭代常见 Python 数据类型中的 glommable 路径,如 this example显示(相应的 glom() 调用就在下面完成)。

如何指定如何从 key 检索数据?

我认为这实际上在 the registration APIs 中得到了解决。我在上面提到过。 get 关键字参数引用内置操作,必须为所有类型指定该操作。

如果您对“retrieve”的定义与内置的 get 注册发生冲突,您可以覆盖它,或者您可以指定一个新的操作,该操作可以禁止使用 register_op 进行注册,(例如,如何添加 assign 操作)。

这又是一个很好的问题,您在这里确实利用了 Python 的强大功能。希望这有帮助!

关于python - 如何使 Glom 与类似 dict 的对象一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57701207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com