gpt4 book ai didi

python - 皮蒙戈 : Convert MongoDB query (cursor) to class instance with defined variable name

转载 作者:行者123 更新时间:2023-12-01 04:11:29 24 4
gpt4 key购买 nike

我有一个来自 MongoDB find() 查询的游标对象。这本质上是一个由多个字典条目组成的可迭代对象。

我想迭代光标,依次获取每个字典并将其转换为特定的类实例,其类型在字典内定义为键(即形式为 dict['class_type']='类_类型')。我想创建变量来引用这些新的类实例,其名称由另一个字典键定义,即 dict['variable_name'] = 'name'。这些名称将是唯一的。

到目前为止,我已经尝试过以下方法:

def mongo_query_to_variable(mongo_query):

for obj in mongo_query:
class_type = obj['class_type']
var_name = obj[key_for_var_name]

exec(var_name + '=' + class_type + '(**obj)', globals())

当我在 shell 中逐行实现该代码时,该代码似乎可以工作,但当我尝试将其用作函数时却不能。我收到错误:

NameError: name 'class_type' is not defined

我知道最好尝试避免 eval/exec,但我不确定我还能如何使用 class_type 字符串动态选择类类型。最后一行本质上是试图从这个类似的问题复制接受的答案(第二部分),但使用动态变量和类名: Convert Python dict to object? 。类 init 中的代码部分包含在基类中并被继承。

我在那里有全局变量,因为查询的长度是可变的,而且我不太确定如何返回动态数量的变量并为它们分配在函数中定义的名称。我听说最好避免全局,那么是否有更好的方法将类实例分配给变量?

如有任何建议,我们将不胜感激;我对编程还很陌生,并且知道我可能会以错误的方式解决这个问题。

干杯

最佳答案

你的设计非常糟糕。

变量名称​​应该在代码编写时创建。在某些极端情况下,您甚至可以动态设置变量。但通常,如果您的描述名称(用作变量名称的名称)发生更改,您需要使用字典。其一,如果您动态创建一个意外的变量,其他程序部分如何知道它是在那里开始的?如果你使用字典,可以通过它的keys进行内省(introspection)。 。所以 my_objects['foo'] 比 foo 好很多不知从何而来的变量。但是,是的,这是可以完成的,而无需诉诸 exec .

首先实例化您的对象。您应该将所有所需的类放在一个 namespace 中。您可以将它们放在一个模块中(它们不必在该模块中定义 - 您只需在那里导入它们的名称: from vehicles import Car, Bus; from plants import Flower, Tree - woukld 使这四个类在进行导入的模块的命名空间中可用。

然后,您可以根据从 mongodb 检索到的字符串名称来检索类对象。如果将命名空间模块命名为“myclasses”:

import myclasses
...
for obj in mongoquery:
cls = getattr(myclasses, obj['class_type']
new_instance = cls(**obj)

现在,要将其存储在程序稍后可以找到的某个地方,正如我上面所说,更好的方法是将其保存在字典中。所以:

   my_objects[obj[key_for_var_name]] = new_instance

就够了。

要将其设置为当前模块(运行该代码的模块)中的全局变量,您可以这样做:

   globals()[obj[key_for_var_name]] = new_instance

不顾所有建议地这样做,指示的变量将在当前模块中可用。其他模块中的代码可以通过使用 module_name.<variable_name> 来访问它。

同样,您可以求助于命名空间模块,并使一切变得更容易 - 一个大部分空白的 Python 模块(或者可能的变量最初设置为 None ),并在您的代码中执行此操作:

setattr(namespace_module, obj[key_for_var_name], new_instance)

如您所见,Python 本质上是真正的内省(introspection),您很少需要求助于 execeval 。但这可能会导致可怕的代码实践。请记住,您必须区分应用程序中的代码和数据 - 变量名称通常是代码。

关于python - 皮蒙戈 : Convert MongoDB query (cursor) to class instance with defined variable name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34878405/

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