解析python文件以查找具有特定标签的类

时间:2016-09-19 20:00:33

标签: python class parsing

我有一个包含许多类的python文件。该文件看起来像这样:

some code, functions and stuff...
class A():
     some code...
@label
class B(A):
     some code...
@label
class C(A):
    some code...
class D(A):
    some code...
some extra code...

我想要做的是在声明之前列出所有具有@label的类,即在这个例子中:[B,C]。 (这将发生在另一个文件中,如果重要的话)

我到目前为止尝试解析文件就像是一个普通的文本文件(带有read()和stuff),但我得到的是类名列表而不是类本身,即([&# 39; B',' C'])我不知道接下来该做什么。我真的希望有更优雅的方式。在获得该类列表之后,我的下一步是为每个类激活它们所具有的特定功能。这就是为什么这个班级的名字对我来说不够。

1 个答案:

答案 0 :(得分:4)

您有两种选择:

  • 使用tokenize module来查找值为token.OP的{​​{1}}令牌,然后使用@ token.NAME令牌,{换行令牌,label。这是最轻量级的。

  • 使用ast module将源解析为树,然后使用class函数,查找ast.walk()个对象。如果对象在ast.ClassDef属性中包含ast.Name id == 'label'对象,则可以记录decorator_list属性。

后者可能最简单:

name

演示:

import ast

def labelled_classnames(source):
    module = ast.parse(source)
    for node in ast.walk(module):
        if not isinstance(node, ast.ClassDef):
            continue
        if any(isinstance(n, ast.Name) and n.id == 'label' 
               for n in node.decorator_list):
            yield node.name