17.13. pyclbr — 类浏览器
目的:实现适用于源代码编辑器的 API ,用于创建类浏览器。
pyclbr
可以扫描 Python 源代码以查找类和独立函数。 使用 tokenize
收集有关类、方法和函数名称以及行号的信息,而不用导入代码。
本节中的示例使用以下源文件作为输入。
pyclbr_example.py
"""Example source for pyclbr.
"""
class Base:
"""This is the base class.
"""
def method1(self):
return
class Sub1(Base):
"""This is the first subclass.
"""
class Sub2(Base):
"""This is the second subclass.
"""
class Mixin:
"""A mixin class.
"""
def method2(self):
return
class MixinUser(Sub2, Mixin):
"""Overrides method1 and method2
"""
def method1(self):
return
def method2(self):
return
def method3(self):
return
def my_function():
"""Stand-alone function.
"""
return
扫描类
pyclbr
暴露了两个公开函数。 第一个是 readmodule()
,它接受模块的名称,因为参数返回类名到包含类源元数据的 Class
对象的映射。
pyclbr_readmodule.py
import pyclbr
import os
from operator import itemgetter
def show_class(name, class_data):
print('Class:', name)
filename = os.path.basename(class_data.file)
print(' File: {0} [{1}]'.format(
filename, class_data.lineno))
show_super_classes(name, class_data)
show_methods(name, class_data)
print()
def show_methods(class_name, class_data):
for name, lineno in sorted(class_data.methods.items(),
key=itemgetter(1)):
print(' Method: {0} [{1}]'.format(name, lineno))
def show_super_classes(name, class_data):
super_class_names = []
for super_class in class_data.super:
if super_class == 'object':
continue
if isinstance(super_class, str):
super_class_names.append(super_class)
else:
super_class_names.append(super_class.name)
if super_class_names:
print(' Super classes:', super_class_names)
example_data = pyclbr.readmodule('pyclbr_example')
for name, class_data in sorted(example_data.items(),
key=lambda x: x[1].lineno):
show_class(name, class_data)
该类的元数据包括定义它的文件和行号,以及超类的名称。 类的方法储存为方法名称和行号之间的映射。 输出显示了根据源文件中的行号按顺序列出的类和方法。
$ python3 pyclbr_readmodule.py
Class: Base
File: pyclbr_example.py [11]
Method: method1 [15]
Class: Sub1
File: pyclbr_example.py [19]
Super classes: ['Base']
Class: Sub2
File: pyclbr_example.py [24]
Super classes: ['Base']
Class: Mixin
File: pyclbr_example.py [29]
Method: method2 [33]
Class: MixinUser
File: pyclbr_example.py [37]
Super classes: ['Sub2', 'Mixin']
Method: method1 [41]
Method: method2 [44]
Method: method3 [47]
函数扫描
pyclbr
中的另一个公开函数是 readmodule_ex()
。 它执行 readmodule()
所做的一切,并将函数添加到结果集中。
pyclbr_readmodule_ex.py
import pyclbr
import os
from operator import itemgetter
example_data = pyclbr.readmodule_ex('pyclbr_example')
for name, data in sorted(example_data.items(),
key=lambda x: x[1].lineno):
if isinstance(data, pyclbr.Function):
print('Function: {0} [{1}]'.format(name, data.lineno))
每个 Function
对象都具有与 Class
对象非常相似的属性。
$ python3 pyclbr_readmodule_ex.py
Function: my_function [51]
另请参阅
- pyclbr 标准库文档
inspect
--inspect
模块可以发现有关类和函数的更多元数据,但需要导入代码。tokenize
--tokenize
模块将 Python 源代码解析为令牌。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。