可在当前名称空间中转储的可拾取数据容器

时间:2013-02-05 20:56:46

标签: python matlab

文档suggests以下在Python中动态创建数据容器的机制:

class Employee:
    pass

john = Employee() # Create an empty employee record

# Fill the fields of the record
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000

上面的内容允许您轻松地将一组不同的变量分组到一个单一的标识符(john)中,而不必像使用字典那样输入引号('')。

我正在寻找一种解决方案,允许我将片段(属性)“转储”回当前命名空间。为解决这个问题,我想到了三个想法/问题:

1。鉴于john上方的标识符,我如何以编程方式获取其属性列表?

2. 如何在当前命名空间中轻松dump john的属性? (即通过浅或深拷贝创建名为namedeptsalary的局部变量

3。以下主题中的最佳答案描述了从argparse创建的命名空间转储变量的方法:Importing variables from a namespace object in Python

也许我可以使用Namespace对象作为数据容器,如上面的帖子所示,然后轻松地将这些变量转储为:

locals().update(vars(john))

为方便起见,下面我包含一个讨论在Python中创建数据容器的其他方法的线程列表,其中一些似乎不可选:

与MATLAB工作流程的连接:

作为参考,MATLAB通过saveload以及变量can be nested and unnested easily提供了这个确切的功能,从而无需为此目的使用引号/词典。这个问题背后的动机是确定在Python中支持这种“可选工作空间”的机制。

1 个答案:

答案 0 :(得分:2)

  • 鉴于john上面的标识符,我如何以编程方式获取它的属性列表?

    vars(john)

从技术上讲,这将为您提供字典映射。如果您只想要属性列表,那么您实际上需要vars(john).keys()

  • 如何在当前命名空间中轻松转储john的属性? (即通过浅或深拷贝创建名为name,dept,salary的局部变量)

我不确定这里关于浅或深拷贝的含义。如果您正在谈论简单引用,那么没有(好)方法来执行此操作。如果您在全局(模块级别)命名空间中,则可以执行以下操作:

globals().update(vars(john))

如果您正在使用CPython,使用locals().update(vars(john))可以(在某些地方),但documentation明确警告不要这样做。你可以做的最好的是某种exec循环(哎呀!):

d = vars(john)
for k in john:
    exec '{key} = d["{key}"]'.format(key=k)

要注意这个代码很丑的原因很简单 - 主要是 - 你不应该像这样做:-P

并且在使用exec时,通常的警告适用 - 请确保您信任john上的属性。例如setattr(john,'__import__("os").remove("useful_file"); foo',"anything here")会让人感觉非常糟糕......