有人可以解释这几行python代码文件名__init__.py

时间:2011-02-16 18:09:37

标签: python

import os, unittest

# figure all the modules available
dir = os.path.split(__file__)[0]

这会打印当前目录,因为文件点指向当前文件名

mods = {}

不知道这是做什么的,但我猜这会创建一个列表?还是数组?

l = []

我想这也会创建一个数组并指定它

__all__ = []

不知道__all__是否具有某些特殊意义,但它看起来像一个数组

for file in os.listdir(dir):
    if not file.endswith('.py') or file == '__init__.py':
        continue
    name = file[5:-3]

5:-3,这是什么意思?

mods[name] = __import__(file[:-3], globals(), locals(), [])

mods意味着什么?

__all__.append(name)
l.append(mods[name].suite())

def suite():
    return unittest.TestSuite(l)

3 个答案:

答案 0 :(得分:2)

从广义上讲,他将文件列在以.py结尾的目录中,然后将这些名称添加到包的内容列表中(__all__)。他继续按名称导入这些脚本(使用__import__),然后将模块列表(表示脚本的对象)组成一组单元测试(unittest.TestSuite)。

通过阅读(或至少略读)完整的官方教程,您将为自己节省一个受伤的世界:

http://docs.python.org/tutorial/index.html


回答您的直接问题:

__all__是一种列出包内容的方法,如果你不喜欢python默认的方式。这里的文档:http://docs.python.org/tutorial/modules.html#importing-from-a-package

索引[5:-3]表示从列表5开始,直到(但不包括)-3的列表中的项目。负指数从结尾开始计数,即-1是最后一项。这里的文档:http://docs.python.org/tutorial/introduction.html#lists

mods是在脚本中创建的。这是一个字典(perl用户读“哈希”),没有特别的意义。 http://docs.python.org/tutorial/datastructures.html#dictionaries

答案 1 :(得分:2)

几乎所有问题都围绕着基本的Python语法。

{}设置一个类似于关联数组的字典 []是一个列表,就像一个可变的标准数组

for file in os.listdir(dir): if not file.endswith('.py') or file == 'init.py': continue name = file[5:-3]

循环浏览文件,我很确定它忽略了非python文件或init.py,然后获取文件名的子字符串

[5:-3]本质上是获取文件名的子字符串,但是当使用os包循环遍历目录时,我不能100%确定是否不同。

mods是在mods = {}

之上声明的字典

附加内容正在向使用[]

声明的列表中添加内容

你应该读“潜入Python”。或者至少访问python的网站并阅读有关基本数据结构的部分。

答案 2 :(得分:1)

该程序正在使用suite()扩展名在同一目录中的文件中定义的.py函数中创建测试套件。

[5:-3]忽略了文件名的前五个字符(我假设是 test _)和.py扩展名。

__ all__是一个包含模块导出标识符的列表。它被设置为先前恢复的模块列表。

这个错综复杂的代码可能是实现目标的错误方法。