Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使glom与类似dict的对象一起工作_Python_Glom - Fatal编程技术网

Python 如何使glom与类似dict的对象一起工作

Python 如何使glom与类似dict的对象一起工作,python,glom,Python,Glom,Glom()是 嵌套结构的基于路径的访问 但如何使其适用于DICT之外的嵌套结构? 考虑以下类(为了简单起见,特意不是实际的集合.abc.Mapping: classmymap: 定义初始化(self,d): self.d=d 定义获取项目(self,k): “只是授权” v=自身d[k] 如果存在(v,(dict,MyMap)): 返回MyMap(五) 其他: 返回v 这项工作: m=MyMap({'a':{'b':{'c':'d'}) 断言m['a']['b']['c']=='d' 但这

Glom()是

嵌套结构的基于路径的访问

但如何使其适用于DICT之外的嵌套结构?

考虑以下类(为了简单起见,特意不是实际的
集合.abc.Mapping

classmymap:
定义初始化(self,d):
self.d=d
定义获取项目(self,k):
“只是授权”
v=自身d[k]
如果存在(v,(dict,MyMap)):
返回MyMap(五)
其他:
返回v
这项工作:

m=MyMap({'a':{'b':{'c':'d'})
断言m['a']['b']['c']=='d'
但这并不是:

从glom导入glom
断言glom(m,'a.b.c')=='d'
我得到一个错误:
PathAccessError:无法访问路径(“a”、“b”、“c”)的第0部分“a”,出现错误:AttributeError(“MyMap”对象没有属性“a”)

更具体地说,如何指定:

  • 什么是节点(即,可以进一步美化的对象)
  • 键迭代器(如何将路径拆分为键)
  • 项获取程序(如何从键检索数据)
如果有帮助,我希望glom满足以下功能:

dot_str_key_iterator=lambda p:p.split('.'))
括号=λobj,k:obj[k]
def simple_glom(目标、规格、,
节点类型=(dict,),
key\u iterator=dot\u str\u key\u iterator,
item\u getter=括号\u getter
):
对于k键迭代器(规范):
目标=项目获取者(目标,k)
如果不存在(目标、节点类型):
打破
返回目标
此函数没有所有的功能,但允许我执行以下操作:

m=MyMap({'a':{'b':{'c':'d'})
简单网格(m,'a.b.c',节点类型=(MyMap,))
或者对于使用所有参数的极端示例:

从类型导入函数类型
从functools导入部分
attr\u glom=部分(简单,
节点类型=(函数类型,类型),
key_iterator=lambda p:p.split('/'),
项目(getter=getattr)
assert attr_glom(MyMap,'.'.'获取项目'.'./.'.'文档'.'''''='仅授权'

这些问题都很好!我会尽力一次解决一个问题:

如何指定对象可以被glommed? 当你在这里说“glom”时,我想你的意思是“访问”

Python有一个非常丰富的数据模型,虽然在每个上下文中“访问”通常都有一个直观的含义,但是猜测它可能会很昂贵,而且风险很大

如何指定键迭代器? 如果要将路径(例如
glom(target,'a.b.c')
)的
'a.b.c'
)拆分为用于访问该路径的结构化键(和操作),我建议特别查看
path.from_text()
path.items()

如果您想查看一个对象并确定该对象中存在哪些路径,那么这就比较复杂了

在撰写本文时,
glom
仍然主要用于访问和构建已知结构,并提供了一些默认值/分支。对于所有可能路径的完整无上下文迭代,目前我所能提供的最好方法是()。请注意,remap没有glom的插件/注册功能,但它可以在常见Python数据类型中直接迭代glommable路径,如图所示(相应的
glom()
调用在下面完成)

如何指定如何从密钥检索数据? 我认为这实际上在我上面提到的中得到了解决。
get
关键字参数引用了一个内置操作,必须为所有类型指定该操作

如果“检索”的定义与内置的
get
注册有冲突,您可以覆盖它,或者指定一个新的操作,该操作可以通过使用进行注册(例如,该操作是如何添加的)


同样,好问题,你真的在利用Python的强大功能。希望这能有所帮助!

谢谢你的扩展答案,glom BDFL。足够的信息让我了解我的工作内容。不过,请向其他读者澄清:我所说的“可以被GLOMED”,是指一个非终端节点。本质上,定义什么时候应该考虑一个对象“嵌套”并进一步探索。重新映射(在下一节中提到)是我需要的。谢谢。您是否有一些涉及glom和重新映射的烹饪书/食谱的链接?@thorwhalen不超出上述情况(尚未):)