Python Как вывести список всех методов / классов, которые были импортированы в класс - PullRequest
2 голосов
/ 03 августа 2011

Как вывести список всех методов / классов, которые были импортированы в класс. Возьмите пример

from module1 import method1
from module2 import method2

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()

возможно ли перечислить все методы, используемые в классе foo? я знаю, что inspect.getmembers(foo) перечислит talk и say_foo, как мне перечислить method1 и method2?

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

Честно говоря, ваш вопрос не имеет большого смысла, и вот почему:

В момент, когда определено foo, между двумя глобалами, называемымиsay_foo и talk и двумя функциями, импортированными вверху вашего кода.

Например, переводчик не будет жаловаться на следующее:

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()

Несмотря на отсутствиеимпорта, это все еще действительный код.Вы, конечно, не сможете звонить say_foo и talk, не получив NameError.

Следующее также хорошо:

from module1 import method1
from module2 import method2

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()

obj1 = foo()
obj1.say_foo()

def method1(): pass

obj1.say_foo()
obj2 = foo()
obj2.say_foo()

Я оставляю вамвыясните, какой method1 вызывается, когда.

Теперь, сказав все это, есть кое-что, что вы можете сделать.Если вы изучите co_names объекта метода, вы получите список имен, которые используются методом :

In [30]: foo.say_foo.im_func.func_code.co_names
Out[30]: ('method1',)

In [31]: foo.talk.im_func.func_code.co_names
Out[31]: ('method2',)

Это явно не совсемто же, что вы спрашиваете , и может или не может быть полезным в зависимости от того, что вы собираетесь делать с этим.

Это также почти наверняка зависит от CPython.

2 голосов
/ 03 августа 2011

используйте модуль ast для анализа вашего кода:

code = """
from module1 import method1
from module2 import method2

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()
"""

import ast, _ast

t = ast.parse(code)
for node in ast.walk(t):
    if isinstance(node, ast.ClassDef) and node.name == "foo":
        klass = node
        break

for node in ast.walk(klass):
    if isinstance(node, _ast.Call):
        print node.func.id

вывод:

method1
method2
1 голос
/ 03 августа 2011

Что? method1 и method2 не были "импортированы" в класс foo. Они импортированы в модуль, поэтому dir(foomodule) покажет их. Но просто нет ссылки от foo до method1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...