在python

时间:2017-04-05 06:11:53

标签: python-2.7 mongoengine introspection inspect keyword-argument

我在python中使用mongoengine作为ORM。现在我有一种情况,我有一个类,实际上是一个模型,形式:

from mongoengine import *
class SomeDetails(Document):
    alias = StringField(required=True)
    version = StringField(required=True)
    author = StringField(required=True)
    someName = StringField(required=True)

现在我需要创建这个类的对象(因此在运行时创建一个文档)

我可以在运行时使用 inspection 创建一个普通类的对象,如下所示:

from inspect import isclass
# moduleImport is a method made to facilitate importing of modules at runtime.
new_module = moduleImport('myModule')
classes = [x for x in dir(new_module) if isclass(getattr(new_module, x))]
class_object = getattr(new_module, classes[0])
instance = class_object()

以上工作完美无缺。我能够在运行时创建一个对象,然后按照我的意愿使用它。

但是,在前面的情况中,当我需要创建一个对象(或者在这种情况下实际上是一个mongo文档)时,根据mongoengine文档herehere,我需要创建对象是这样的:

docObject = SomeDetails(alias=value, version=value, author=value, someName=value)
docObject.save() # to save the document in the mongodb

其中我需要在创建类的对象时为每个关键字参数指定值,以便成功保存文档。

所以在这种情况下,如果我尝试在运行时创建 SomeDetails 类的对象(如上面的 inspect 示例所示),我该如何提供这些关键字参数在创建对象的运行时?

一个重要的问题

  

因此,关键字参数也不为人知。它们也是在运行时获取的。在运行时,在创建对象之前,是的,我知道关键字args及其值的列表,我可以将其作为字典使用:

{alias:"a", version:"b", author:"c", someName:"d"}

但即便如此,这个dic本身只能在运行时使用。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

data = {alias:"a", version:"b", author:"c", someName:"d"}
instance = class_object(**data)

更多关于** kwargs here

答案 1 :(得分:0)

据推测,你只需要替换

instance = class_object()

使用

instance = class_object(alias="a", version="b", author="c", someName="d")

如果这不起作用,请详细说明你得到的错误。