Python 理解和测试[self.\u class.\u模块].\u文件_
在阅读基于python的软件时,我对一行python代码感到困惑:Python 理解和测试[self.\u class.\u模块].\u文件_,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,在阅读基于python的软件时,我对一行python代码感到困惑:path=sys.modules[self.\uuuuuuu class\uuuuuuuuu.\uuuuuuu module\uuuuuuuuuu]。\uuuuuuu文件 我可以猜它试图在类文件中返回文件名,但我不太清楚它的确切用法。我将相关的代码段保存到一个名为test.py的文件中,并试图通过python test.py对其进行测试,但它不打印任何内容。如何测试这种文件 import os import sys class
path=sys.modules[self.\uuuuuuu class\uuuuuuuuu.\uuuuuuu module\uuuuuuuuuu]。\uuuuuuu文件
我可以猜它试图在类文件中返回文件名,但我不太清楚它的确切用法。我将相关的代码段保存到一个名为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")
python中的类有一个
\uuuuuuuuuuuuuuu模块
属性,该属性包含在其中定义类的模块的名称。此外,每个模块都包含一个属性,该属性具有.py
文件的完整路径
他正在尝试获取定义类的文件的文件路径,但他并不是最好的方法,理想情况下,您可以使用以下方法进行索引:
而不是通过类(即self.\uuuuu类\uuuuu.\uuuuu模块\uuuuuu==\uuuuuuuu名称\uuuuu
)。请注意,如果&uuuuuu name\uuuuu==“\uuuuuu main\uuuuuuu”
这将失败,因为模块没有定义\uuuuuu file\uuuuuuuuu
属性。您需要采取以下防范措施:
path = sys.modules[__name__].__file__ if __name__ == "__main__" else __file__
其中如果
则\uuuuuu file\uuuuuu
将包含正在执行的文件的路径
接下来,如果脚本以\uuuuu main\uuuu
的方式运行,请在脚本中添加惯用子句,以便初始化对象:
if __name__ == "__main__":
testloadfile() # initialize
现在,如果将其称为\uuuuu main\uuuu
脚本:
python -m test.py
或者,如果您导入它,它将拾取\uuuuu文件
属性,打印它,然后打印文件名
p.s:立即修复最终打印中的缩进,我在这里看不到“任何类型的main
例程”,而python
的命令行(!)执行都不会出现这种情况。在这里,您定义了“一个类”,并为该类定义了一个构造函数,似乎您还抛出了一个print
语句,但我在这里没有看到任何东西告诉python
当从命令行执行这个.py
文件时应该做什么。因此,它什么都不做并不奇怪。:-)“现在就去看看吧,”看看一些现有的Python(库)代码。注意他们所做的,你也一样。这真的很奇怪。。。似乎sys.modules[self.\uuuuu class.\uuuuu.\uuuuu module.\uuuuu.\uuuuu.\uuuuuu
应该只给你\uuuuu文件.\uuuuuuu
…最终的打印的正确缩进级别是多少?它是类定义的一部分还是初始化方法的一部分,因为它是缩进错误。@Mike:如果最终的打印()
是类定义的一部分(而不是初始化方法的一部分),运行脚本将在类定义执行时执行它。不管怎样,@mgilson看起来是正确的,它只是一种复杂的方式来获取\uuu文件\uuu
。是的。。。我想我同意你的看法。。。
python -m test.py