21

“Dunder”的定义(双分):http : //www.urbandictionary.com/define.php ?term= Dunder


根据Python 代码中模块级“dunders”(如 、 等)的位置,我有一个__all__问题__version____author__

在阅读PEP8并看到这个Stack Overflow 问题时,我想到了这个问题。

接受的答案说:

__author__是一个全局“变量”,因此应该出现在导入的下方。

但在 PEP8 部分模块级别的名称中,我读到以下内容:

模块级别的“dunders”(即带有两个前导和两个下划线的名称),例如,,,等__all__应该放在模块文档字符串之后,但在任何导入语句之前,除了来自导入。Python 要求未来导入必须出现在模块中除文档字符串之外的任何其他代码之前。__author____version____future__

作者还给出了一个代码示例:

"""This is the example module.

This module does stuff.
"""

from __future__ import barry_as_FLUFL

__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'Cardinal Biggles'

import os
import sys

但是当我将上述内容放入 PyCharm 时,我看到了这个警告(另见截图):

PEP8:模块级导入不在文件顶部

PyCharm 忽略 PEP8?

问题:用双下划线存储这些变量的正确方法/位置是什么?

4

1 回答 1

24

PEP 8 最近进行了更新,将位置放在导入之前。请参阅cf8e888b9555 修订版,于 2016 年 6 月 7 日提交:

放松__all__的位置。

将所有模块级dunders放在同一位置,并删除多余的版本簿记信息。

关闭 #27187。伊恩·李的补丁。

第二天进一步更新了文本以解决from __future__ import ...警告。

补丁链接到issue #27187,这反过来又引用了这个pycodestyleissue,在那里发现 PEP 8 不清楚。

在此更改之前,由于模块级 dunder 全局变量没有明确的指导方针,因此 PyCharm 和其他答案当时是正确。我不确定 PyCharm 如何实现他们的 PEP 8 检查;如果他们使用pycodestyle 项目(事实上的 Python 样式检查器),那么我相信它会自动修复。否则,可能会向他们提交错误以查看此问题的修复。

于 2016-08-19T17:06:14.963 回答