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]

See also

pyclbr
本モジュールの標準ライブラリドキュメント
inspect
inspect モジュールはもっと多くのクラスと関数に関するメタデータを検出できますが、そのコードをインポートする必要があります。
tokenize
tokenize モジュールは Python のソースコードをトークンへ分割します。
Bookmark and Share