我有一个包含许多类的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'])我不知道接下来该做什么。我真的希望有更优雅的方式。在获得该类列表之后,我的下一步是为每个类激活它们所具有的特定功能。这就是为什么这个班级的名字对我来说不够。
答案 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