sys.modules[__name__].__doc__ 和 __doc__ 总是一样的吗?

Are sys.modules[__name__].__doc__ and __doc__ always the same?

我正在尝试从定义的同一模块中访问模块文档字符串。实际例子:

#!/usr/bin/env python3
"Module docstring that explains what the script does."

import argparse as ap

parser = ap.ArgumentParser(description=__doc__)
...

我一直使用__doc__,但后来我偶然发现了一些使用sys.module[__name__].__doc__的代码。这两个对象看起来是一样的,但我想知道它们是否 always 相同。也就是说,就是下面的:

>>> sys.module[__name__].__doc__ is __doc__
True

总是正确的?我可以在示例中安全地使用 __doc__ 而不是 sys.modules[__name__].__doc__ 吗?

在实践中它们将是相同的,除非您特意使它们不同。

如果您分配给 __name__ 那么您可以使表达式引用不同的模块:

"""My doc string"""
import sys

print(__doc__)
__name__='sys'
print(sys.modules[__name__].__doc__)

将打印两个不同的文档字符串。

或者,您可以单独保留 __name__,但从 sys.modules 中删除您的模块,然后导入具有相同 __name__ 的另一个模块(或 Python 2.x 使用 reload() 在编辑文档字符串后重新加载模块)。如果您保留对旧模块中函数的引用,您仍然可以调用它并且 __doc__ 将是旧值,而 sys.modules[__name__].__doc__ 是新值。

所以它们可能会有所不同,但前提是您努力做到这一点。