pyclbr – Python クラスブラウザサポート¶
目的: | クラスブラウザを作成するためにソースコードエディタに使い易い API を実装する |
---|---|
利用できるバージョン: | 1.4以上 |
pyclbr はクラスと独立した関数を探すために Python のソースコードを解析することができます。クラスやメソッド、関数名や行数についての情報は、コードをインポートすること なく tokenize を使用して集めます。
入力データとしてこのソースファイルを使用した例を次に示します。
"""Example source for pyclbr.
"""
class Base(object):
"""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 が提供する関数が2つあります。 readmodule() はモジュール名を引数に取り、クラスソースに関するメタデータを含む Class オブジェクトへのクラス名のマッピングを返します。
import pyclbr
import os
from operator import itemgetter
def show_class(name, class_data):
print 'Class:', name
print '\tFile: {0} [{1}]'.format(os.path.basename(class_data.file), class_data.lineno)
show_super_classes(name, class_data)
show_methods(name, class_data)
print
return
def show_methods(class_name, class_data):
for name, lineno in sorted(class_data.methods.items(), key=itemgetter(1)):
print '\tMethod: {0} [{1}]'.format(name, lineno)
return
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, basestring):
super_class_names.append(super_class)
else:
super_class_names.append(super_class.name)
if super_class_names:
print '\tSuper classes:', super_class_names
return
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)
そのクラスが定義されているファイルと行数を含むメタデータはスーパークラスの名前と同様です。クラスのメソッドはメソッド名と行数のマッピングとして保存されます。ソースファイルの行数で順番にリストしたクラスとメソッドは次の通りです。
$ python pyclbr_readmodule.py
Class: Base
File: pyclbr_example.py [10]
Method: method1 [14]
Class: Sub1
File: pyclbr_example.py [17]
Super classes: ['Base']
Class: Sub2
File: pyclbr_example.py [21]
Super classes: ['Base']
Class: Mixin
File: pyclbr_example.py [25]
Method: method2 [29]
Class: MixinUser
File: pyclbr_example.py [32]
Super classes: ['Sub2', 'Mixin']
Method: method1 [36]
Method: method2 [39]
Method: method3 [42]
関数を解析する¶
もう1つの pyclbr のパブリック関数は readmodule_ex() です。それは readmodule() の全機能に加えて、結果セットへの関数を追加します。
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 オブジェクトそっくりのプロパティを持ちます。
$ python pyclbr_readmodule_ex.py
Function: my_function [45]