gpt4 book ai didi

python - PyYAML 解析成任意对象

转载 作者:太空狗 更新时间:2023-10-30 00:52:25 25 4
gpt4 key购买 nike

我有以下 Python 2.6 程序和 YAML 定义(使用 PyYAML ):

import yaml

x = yaml.load(
"""
product:
name : 'Product X'
sku : 123
features :
- size : '10x30cm'
weight : '10kg'

"""
)

print type(x)
print x


结果如下:
<type 'dict'><br/>
{'product': {'sku': 123, 'name': 'Product X', 'features': [{'weight': '10kg', 'size': '10x30cm'}]}}

可以用 x 的字段创建一个对象?

我想要以下内容:

print x.features[0].size

我知道可以从现有类创建和实例化,但这不是我在这个特定场景中想要的。

编辑:

  • 更新了关于“强类型对象”的混淆部分。
  • 更改了对 features 的访问权限Alex Martelli 建议的索引器

最佳答案

所以你有一个包含字符串键和值的字典,可以是数字、嵌套字典、列表,你想把它包装到一个实例中,这样你就可以使用属性访问来代替字典索引,并且“调用索引”代替列表索引——不确定“强类型”与此有什么关系,或者为什么您认为 .features(0).features[0] 更好(这是一种更自然的索引列表的方法!),但是,当然,这是可行的。例如,一个简单的方法可能是:

def wrap(datum):
# don't wrap strings
if isinstance(datum, basestring):
return datum
# don't wrap numbers, either
try: return datum + 0
except TypeError: pass
return Fourie(datum)

class Fourie(object):
def __init__(self, data):
self._data = data
def __getattr__(self, n):
return wrap(self._data[n])
def __call__(self, n):
return wrap(self._data[n])

所以 x = wrap(x['product']) 应该满足你的愿望(当你的整体逻辑显然需要 x.product.features 时你为什么要跳过那个级别(0).size,我不知道,但显然在调用点应用跳过更好,而不是硬编码在包装类或我刚刚展示的包装工厂函数中。

编辑:正如 OP 所说他确实想要 features[0] 而不是 features(0),只需更改最后两行到

  def __getitem__(self, n):
return wrap(self._data[n])

即,定义 __getitem__(索引基础的魔术方法)而不是 __call__(实例调用的魔术方法)。

“现有类”(此处为 Fourie)的替代方案是基于对包装的字典的内省(introspection)动态创建一个新类——同样可行,但严重的深灰色,如果不是真的黑色,魔法,并且没有任何我能想到的实际操作优势。

如果 OP 可以准确地阐明为什么他可能渴望在动态创建类的元编程高峰之后,他认为他可能会通过这种方式获得什么优势,等等,我将展示如何做到这一点(以及,我可能还会展示为什么渴望获得的优势实际上存在;-)。但是在任何编程工作中,简单都是一个重要的品质,当像上面这样简单明了的代码工作得很好时,使用“深黑魔法”通常不是最好的主意!-)

关于python - PyYAML 解析成任意对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2442933/

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