在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
,即定义类的模块的名称?
答案 0 :(得分:13)
当您直接执行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
答案 1 :(得分:-1)
我猜你可以使用sys._getframe()hackery来获得你想要的东西。