是否可以使用 Enthought 特征按声明顺序遍历 class 特征?
Is it possible to iterate through class trait in order of declaration using Enthought traits?
我们使用 Enthought Traits 来声明一些用于创建数据库模式的 python classes 和用于添加记录的 UI。所以我们有代码来遍历 class 特征并执行一些操作。一个常见的问题是,声明的顺序通常对理解模式和 UI 很重要或非常有帮助,但这个顺序在 class_traits
中丢失了(因为它是一个 python 字典)。
有没有办法自动保持class_traits
中的声明顺序?也许通过重写 HasTraits
?
中的一些方法
我们现在使用 python 2(我们正在转向 python 3,但这需要时间)。
编辑:在发布之前,我发现 this question 提出了一个类似于 Robert Kern 所建议但没有片段的技巧。我期待 Traits 会在那里提供一些帮助。无论如何,罗伯特的回答很有用。
在 Python 2 中并不容易。Python 2 根本不保留该信息。
如果您有 运行 .py
来源可用,则可以从该文件重新分析 class 定义并以这种方式重建顺序。如果你不是,那么我想你可以尝试解析字节码,但你只能靠自己了。
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
我们使用 Enthought Traits 来声明一些用于创建数据库模式的 python classes 和用于添加记录的 UI。所以我们有代码来遍历 class 特征并执行一些操作。一个常见的问题是,声明的顺序通常对理解模式和 UI 很重要或非常有帮助,但这个顺序在 class_traits
中丢失了(因为它是一个 python 字典)。
有没有办法自动保持class_traits
中的声明顺序?也许通过重写 HasTraits
?
我们现在使用 python 2(我们正在转向 python 3,但这需要时间)。
编辑:在发布之前,我发现 this question 提出了一个类似于 Robert Kern 所建议但没有片段的技巧。我期待 Traits 会在那里提供一些帮助。无论如何,罗伯特的回答很有用。
在 Python 2 中并不容易。Python 2 根本不保留该信息。
如果您有 运行 .py
来源可用,则可以从该文件重新分析 class 定义并以这种方式重建顺序。如果你不是,那么我想你可以尝试解析字节码,但你只能靠自己了。
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