在python中创建在运行时具有关键字参数的类的对象

问题描述:

我在python中使用mongoengine作为ORM。现在我有一个情况我有一个类,实际上是一个模型,形式为:在python中创建在运行时具有关键字参数的类的对象

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

现在我需要创建该类的对象(因此在运行时文件)

我可以通过使用检查,像这样在运行时创建一个普通的类的对象:

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() 

和上面的作品完美。我可以在运行时创建一个对象,然后按照我的意愿使用它。

但是,在上述第一种情况下,当我需要创建一个对象(或者实际上在这种情况下,蒙戈文件),按照该mongoengine文档herehere,我需要创建对象是这样的:

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

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

因此,在这种情况下,如果我尝试创建在运行时SomeDetails类的对象(如图中检查上述例子)如何可以在运行时提供这些关键字参数而创建对象?

一个重要的抓

所以关键字参数也没有事先知道。它们也在运行时被提取。在运行时,对象创建之前,是的,我知道关键字args来列表和它的价值,这是提供给我的字典为:

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

但即使是这样,这DIC本身只可用在运行时。

+1

老实说,你似乎有做大量的代码,在这里,因为体操数据是动态结构。虽然mongodb擅长处理这个问题,但mongoengine确实不是。你可能想要考虑简单地使用pymongo –

你可以试试这个:

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

更多关于** kwargs here

+0

哇!感谢这个惊人的答案,以及同样惊人的指向** kwargs博客的指针! – qre0ct

想必,你只需更换线

instance = class_object() 

随着

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

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

+0

是的。这肯定会奏效。但是,有一个小的问题。我的坏事没有在问题中提出。所以关键字的参数也是事先不知道的。它们也在运行时被提取。所以上述建议在这种情况下不起作用,因为我没有这个信息直到运行时。在运行时,在创建对象之前,我确实知道关键字参数列表和它的值,这些值可以作为字典提供给我: {别名:“a”,版本:“b”,作者:“c” ,someName:“d”},但即使如此,该dic本身仅在运行时才可用。更新了问题。 – qre0ct

+0

如果你知道任何表达式可以作为函数的参数传递,你可以从我的推论中得出史蒂夫的答案。也就是说,如果你可以调用'f(“ab”)'',那么你可以调用'f(“a”+“b”)'或者你可以设置一个变量'myvar =“ab”',然后调用'f )',并得到完全相同的结果。我认为这个问题真的源于对python评估代码的误解。将硬编码字符串传递给函数,执行变量查找或扩展字典之间没有区别,无论它是在运行时通过评估表达式来完成的。 –