0

Pythonコードを含むファイルがあります。私はそれを検査する必要があります(コンパイルは問題ありませんが、インポートまたは実行せずに)。

ファイルで宣言されたクラスを取得して、それらが特定の基本クラスから派生しているかどうかを確認したいと思います。

例えば、

たとえば、「foo」モジュールには、「Foo」クラスから派生した「Bar」という名前のクラスが定義されています。

class Foo(object):
    pass

class Bar(Foo)
    pass

次に、次のような外部pythonソースファイルがあります。

from foo import Bar

class Baz(Bar):
    pass

ソースを調べて、ファイルに「Foo」から派生したクラス定義が含まれているかどうかを確認したいと思います。

ASTを解析する必要がありますか?これをサブクラス定義について静的に分析するのは正しい方向ですか?

4

2 に答える 2

1

コードをコンパイルしない答えは、pysmellなどを使用することです。

与えられた:

# base.py
class Base(object):
    def __init__(self, name):
        self.name = name

class First(Base):
    def __init__(self, name="first"):
        super(First, self).__init__(name)


class Second(First):
    def __init__(self, name="second"):
        super(Second, self).__init__(name)

class Third(Second):
    def __init__(self, name="third"):
        super(Third, self).__init__(name)

t = Third()

を実行pysmell base.pyすると、次のような PYSMELLTAGS ファイルが生成されます。

{'CLASSES': {'base.Base': {'bases': ['object'],
                           'constructor': ['name'],
                           'docstring': '',
                           'methods': [],
                           'properties': ['name']},
             'base.First': {'bases': ['base.Base'],
                            'constructor': ["name='first'"],
                            'docstring': '',
                            'methods': [],
                            'properties': []},
             'base.Second': {'bases': ['base.First'],
                             'constructor': ["name='second'"],
                             'docstring': '',
                             'methods': [],
                             'properties': []},
             'base.Third': {'bases': ['base.Second'],
                            'constructor': ["name='third'"],
                            'docstring': '',
                            'methods': [],
                            'properties': []}},
 'CONSTANTS': ['base.t'],
 'FUNCTIONS': [],
 'HIERARCHY': ['base'],
 'POINTERS': {}}

これは、OPが他のクラスから派生したクラスを認識するという目標を達成するのに役立つと思います。

于 2013-02-02T00:00:15.760 に答える
-1

汚すだけだからこれでいいと思ってたx

import inspect
from tester import Test

x = __import__("something", globals={}, locals={})

for (n,v) in inspect.getmembers(x):
    if inspect.isclass(v):
        print "CLASS:", n, inspect.getmro(v)
        if Test != v and Test in inspect.getmro(v):
            print "FOUND:", n, v


 #something.py
 from tester import Test
 class SomeClass(Test): pass


 #tester.py
 class Test(object): pass

出力:

CLASS: SomeClass (<class 'something.SomeClass'>, <class 'tester.Test'>, <type 'object'>)
FOUND: SomeClass <class 'something.SomeClass'>
CLASS: Test (<class 'tester.Test'>, <type 'object'>)
于 2013-01-31T19:30:10.573 に答える