是否可以使用Enthought特征按照声明的顺序迭代类特征?

时间:2017-03-15 09:30:36

标签: python enthought

我们使用Enthought Traits声明一些用于创建数据库模式的python类和用于添加记录的UI。所以我们有代码来遍历类特征并执行一些操作。一个常见的问题是声明的顺序通常很重要或非常有助于理解模式和UI,但这个顺序在class_traits中丢失(因为它是一个python dict)。

有没有办法在class_traits中自动保留声明顺序?也许通过覆盖HasTraits中的一些方法?

我们现在正在使用python 2(我们正在迁移到python 3,但需要时间)。

编辑:在发帖之前,我发现this question提示了类似于Robert Kern建议但没有代码段的技巧。我期待Traits会在那里提供一些帮助。罗伯特的答案无论如何都很有用。

1 个答案:

答案 0 :(得分:0)

在Python 2中不容易.Python 2根本不保留该信息。

如果您使用.py源可用,则可以从该文件重新分析类定义并重新构建该方式。如果你不是,那么我想你可以尝试解析字节码,但你自己就是在那里。

import ast
import inspect


def ordered_class_traits(cls):
    source = inspect.getsource(cls)
    mod_ast = ast.parse(source)
    class_trait_names = cls.class_trait_names()
    class_ast = mod_ast.body[0]
    for node in class_ast.body:
        # This probably doesn't capture every possible trait declaration
        # out there, but it does the job for most of them.
        if isinstance(node, ast.Assign):
            target = node.targets[0]
            if isinstance(target, ast.Name):
                if target.id in class_trait_names:
                    yield target.id