我们使用Enthought Traits声明一些用于创建数据库模式的python类和用于添加记录的UI。所以我们有代码来遍历类特征并执行一些操作。一个常见的问题是声明的顺序通常很重要或非常有助于理解模式和UI,但这个顺序在class_traits
中丢失(因为它是一个python dict)。
有没有办法在class_traits
中自动保留声明顺序?也许通过覆盖HasTraits
中的一些方法?
我们现在正在使用python 2(我们正在迁移到python 3,但需要时间)。
编辑:在发帖之前,我发现this question提示了类似于Robert Kern建议但没有代码段的技巧。我期待Traits会在那里提供一些帮助。罗伯特的答案无论如何都很有用。
答案 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