gpt4 book ai didi

python - 即时从 YAML/JSON 创建模型

转载 作者:太空狗 更新时间:2023-10-29 20:27:49 25 4
gpt4 key购买 nike

我正在尝试 MongoEngine ,一个用于 Python 的 DRM 库,可与 MongoDB 一起使用。我可以从网站定义一个像这个例子这样的模型:

class User(Document):
email = StringField(required=True)
first_name = StringField(max_length=50)
last_name = StringField(max_length=50)

它就像一个魅力,MongoEngine 真的很棒。好吧,我想更进一步,想知道我是否可以在 JSON 或 YAML 文件中的某处定义我的模型,或者其他任何东西,然后使用它创建模型。所以这个声明在 JSON 中看起来像这样:

{
"model":"User",
"fields":{
"email":{
"type":"string",
"required":"true"
},
"first_name":{
"type":"string",
"max_length":"50"
},
"last_name":{
"type":"string",
"max_length":"50"
}
}
}

然后我会解析这个 JSON 并使用它创建一个模型。可能它只是我每次修改模型定义时执行的单个导入操作,或者它可能每次都可以解析整个 JSON。那是个好场景吗?我只想让将要使用该应用程序的人定义他们自己的模型,而不必深入研究代码。任何关于如何创建动态模型的想法都将受到赞赏

最佳答案

如果您要使用 YAML,pyyaml完全无痛,并使用 python 的内置类型(或者您定义的更复杂的类型)自动输出数据结构。

无论如何,我也强烈推荐Rx作为验证器,因此您可以轻松验证加载文件的完整性。*

至于使用它来创建模型,您可以使用内置函数 type (不是 type(object),而是 type(name, bases, dict))...“[r]返回一个新的类型对象。这本质上是一个动态的类声明的形式。”

所以,你可以调用:

def massage(fields_dict):
#transform your file format into a valid set of fields, and return it

user_class = type(yaml_data['model'], Document, massage(yaml_data['fields']) )

*巧合的是,我在过去的八个小时里同时使用了这两种方法 - 它们可以轻松地协同工作,例如:

import yaml
import Rx

data = yaml.load(open("foo.yaml")
rx = Rx.Factory({ "register_core_types": True })
schema = rx.make_schema(yaml.load(open("schema.yaml")))

if not schema.check(data):
raise ValueError("data file contents are not in a valid format")

关于python - 即时从 YAML/JSON 创建模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6311738/

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