Я думаю, вам нужно будет накатить свою собственную версию, но стандартная библиотека inspect
module даст вам большую часть того, что вам нужно здесь.
inspect.ismethod()
и inspect.isfunction()
помогут определить, связана ли функция (определена в классе) или нет, и, таким образом, ищете ли вы класс или модуль (вы надеетесь ... причина в том, что функция может быть определенным в другой области видимости, нежели модуль ... например, как локально определенная функция в рамках другой функции или метода или как лямбда (на самом деле то же самое))
Обратите внимание, в частности, что im_class
метода не будет извлекать вас класс, в котором был определен метод. Но вы можете (используя inspect.getmro()
) следовать иерархии классов и найти «самый последний» класс, который метод был определен в.
Кстати, мне интересно, будет ли модификация модуля подходящей для вас ... во многих случаях имена в этом модуле уже могут быть импортированы в другое место ...) В частности, я бы волновался (для вас и ваших будущий здравый смысл), если у вас есть опыт работы с мета-программированием в ruby и вы пытаетесь повторить это в python - это совсем другое дело, и лучше не пытаться делать рутинные вещи в python.