Как получить имя модуля определения класса объекта, а не имя модуля экземпляра объекта? - PullRequest
17 голосов
/ 17 февраля 2010

В Python 2.5 у меня есть следующий код в модуле с именем modtest.py:

def print_method_module(method):
    def printer(self):
        print self.__module__
        return method(self)
    return printer

class ModTest():

    @print_method_module
    def testmethod(self):
        pass

if __name__ == "__main__":
    ModTest().testmethod()

Однако, когда я запускаю это, он печатает:

__main__

Если я создаю второй файл с именем modtest2.py и запускаю его:

import modtest

if __name__ == "__main__":
    modtest.ModTest().testmethod()

Это распечатывает:

modtest

Как я могу изменить декоратор, чтобы он всегда выводил modtest, имя модуля, в котором определен класс?

Ответы [ 2 ]

14 голосов
/ 17 февраля 2010

Когда вы выполняете исходный файл Python напрямую, имя модуля этого файла __main__, даже если оно известно под другим именем, когда вы выполняете какой-то другой файл и импортируете его.

Возможно, вы захотите сделать то же самое, что и в modtest2, и импортировать модуль, содержащий определение класса, вместо непосредственного выполнения этого файла. Однако вы можете получить имя основного модуля для диагностических целей:

def print_method_module(method):
    def printer(self):
        name = self.__module__
        if name == '__main__':
            filename = sys.modules[self.__module__].__file__
            name = os.path.splitext(os.path.basename(filename))[0]
        print name
        return method(self)
    return printer
0 голосов
/ 17 февраля 2010

Полагаю, вы могли бы использовать sys._getframe (), чтобы получить то, что вы хотите.

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