2

该文档建议使用以下机制在 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在当前命名空间中轻松添加属性?(即通过浅拷贝或深拷贝创建名为name,dept的局部变量)salary

3.以下线程中的最佳答案描述了一种从创建的命名空间中转储变量的方法argparseImporting variables from a namespace object in Python

也许我可以使用一个Namespace对象作为数据容器,就像上面的帖子一样,然后轻松地转储这些变量:

locals().update(vars(john))

?

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

与 MATLAB 工作流程的连接:

作为参考,MATLAB 通过save和提供了这个确切的功能load,并且变量可以很容易地嵌套和取消嵌套,从而无需为此目的使用引号/字典)。这个问题背后的动机是确定在 Python 中支持这种“可选工作区”的机制。

4

1 回答 1

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

    vars(john)

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

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

我不确定你在这里对浅拷贝或深拷贝的意思。如果您正在谈论简单的引用,那么没有(好的)方法可以做到这一点。如果您在全局(模块级)命名空间中,您可以执行以下操作:

globals().update(vars(john))

如果您使用的是 CPython,则使用locals().update(vars(john))作品(在某些地方),但文档明确警告不要这样做。你能做的最好的就是某种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"),这将是一个非常糟糕的一天......

于 2013-02-05T21:12:50.997 回答