理解和测试[self._class _._ module _] ._ file_

时间:2016-07-06 23:44:54

标签: python python-2.7 python-3.x

在阅读基于python的软件时,我对一行python代码感到困惑:path = sys.modules[self.__class__.__module__].__file__

我猜它是试图在类文件中返回文件名,但我不太清楚它的确切用法。我将相关的代码段保存到名为test.py的文件中,我试图通过python test.py对其进行测试,但它不会打印任何内容。我该如何测试这种文件?

import os
import sys

class testloadfile:
  def __init__(self, test_path=None):
     if test_path is None:
        path = sys.modules[self.__class__.__module__].__file__
        # print path
        path = os.path.abspath(os.path.join(path, os.pardir))
        # print path
        path = os.path.join(path, "test.r")
        print(path)
        test_path = path

    print("r file loaded")  

1 个答案:

答案 0 :(得分:1)

python中的类具有__module__属性,该属性包含定义类的模块的名称。此外,每个模块都包含__file__属性,该属性具有.py文件的完整路径。

他正在尝试获取定义类的文件的文件路径,但他没有采用最好的方法,理想情况下你可以使用{{3 }}:

path = sys.modules[__name__].__file__ 

而不是通过班级(即self.__class__.__module__ == __name__)。请注意if __name__ == "__main__"这会失败,因为sys.modules模块没有定义__file__属性。你需要防范它:

path = sys.modules[__name__].__file__ if __name__ == "__main__" else __file__

其中if __name__ == "__main__"然后__file__将包含正在执行的文件的路径。

接下来,在脚本中添加通常子句,以便在脚本以__main__运行时初始化对象:

if __name__ == "__main__":
    testloadfile()  # initialize

现在,如果您将其称为__main__脚本,其中包含:

python -m test.py 

或如果你import它,它将拾取__file__属性,打印它然后打印文件名。

P.s :修复最终print中的缩进。