Получить содержащий контекст функции - PullRequest
1 голос
/ 28 декабря 2011

В Python, как я могу получить содержащий контекст объекта (функции, в моем случае), чтобы я мог изменить его?Например, если это метод, его контекст - это класс;если это свободная функция, ее контекст является модулем.

Смежный вопрос:
Может ли декоратор Python метода экземпляра получить доступ к классу?

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Я думаю, вам нужно будет накатить свою собственную версию, но стандартная библиотека inspect module даст вам большую часть того, что вам нужно здесь.

inspect.ismethod() и inspect.isfunction() помогут определить, связана ли функция (определена в классе) или нет, и, таким образом, ищете ли вы класс или модуль (вы надеетесь ... причина в том, что функция может быть определенным в другой области видимости, нежели модуль ... например, как локально определенная функция в рамках другой функции или метода или как лямбда (на самом деле то же самое))

Обратите внимание, в частности, что im_class метода не будет извлекать вас класс, в котором был определен метод. Но вы можете (используя inspect.getmro()) следовать иерархии классов и найти «самый последний» класс, который метод был определен в.

Кстати, мне интересно, будет ли модификация модуля подходящей для вас ... во многих случаях имена в этом модуле уже могут быть импортированы в другое место ...) В частности, я бы волновался (для вас и ваших будущий здравый смысл), если у вас есть опыт работы с мета-программированием в ruby ​​и вы пытаетесь повторить это в python - это совсем другое дело, и лучше не пытаться делать рутинные вещи в python.

0 голосов
/ 28 декабря 2011

Что вы имеете в виду под функциями globals() и locals().Они оба возвращают словарь, содержащий соответственно глобальные и локальные значения.Однако вы не можете выполнять с ними метапрограммирование, потому что их изменение не разрешено.

AFAIK Нет способа получить контекст чего-либо, кроме текущего (вызывающего globals / locals).).

...