在Python中,命名元组是否应遵循常量命名约定?

11

我写了一个小的Python模块,在其中使用了一些命名元组来传递信息,因为我觉得它们非常表达。我考虑了这些类型,并按照PEP8规范为类名命名(骆驼拼写法)。然而,Pylint看到了以下代码:

PersonData = collections.namedtuple('PersonData', 'name surname age')

在模块的全局范围内发生错误:无效的常量名称“PersonData”。

我是否误用了namedtuple?有什么Pythonic推荐?我只能想到抑制警告、将结构重命名为PERSON_DATA或使其成为完整类。注意,在我的情况下,它没有方法是有意义的。

如果答案是抑制警告。这不会是pylint与namedtuple反复出现的问题吗?

(使用pylint-0.26.0、python-2.7.4)

4个回答

6

这个问题在较新版本的pylint中已经得到解决。

我的系统使用了Ubuntu (13.04)仓库里的版本(pylint-0.26.0)。通过使用virtualenv,我可以pip安装pylint-1.0.0,该版本能够识别命名元组并实际上强制使用与类相同的格式。

请注意,如果您对字段字符串进行字符串操作,它将无法提取数据。例如:

PersonData = collections.namedtuple('PersonData', 'name ' + 'surname age')

即使如此,仍将导致pylint-1.0.0输出无效常量名称的错误代码。 在这种情况下,唯一的解决办法是按照Martijn Pieters的建议禁用警告。


8
“solved in newer versions of pylint”的意思是“在更新版本的pylint中得到解决”。但我使用最新的Pylint版本(1.4.0),仍然会收到此错误。 - Meredith
我刚刚在不同的虚拟环境中尝试了0.26.0、1.0.0和1.4.0,但对我来说仍然显示相同的结果: 最旧版本需要 CAPITAL_CASE,而较新的两个版本需要 CamelCase。 我建议您再次尝试(注意在您的 homedir 中的自定义 .pylintrc),并向开发人员注册回归 bug 报告。 - Luis
3
我也遇到了使用 pylint 1.4.0 和默认配置时出现的这个错误。 - simon
我仍然在pylint3 1.6.5中看到它。 - ʇsәɹoɈ

5

在这里,你可以忽略pylint,你使用了正确的驼峰命名规范。

你可以抑制警告:

PersonData = collections.namedtuple('PersonData', 'name surname age')  # pylint: disable-msg=C0103
namedtuple是一个类工厂,因此需要遵循类的命名规范。

3
只有一个小问题:我更喜欢以这种格式编写pylint内联注释:# pylint: disable=invalid-name更易读,更清晰明了地说明了什么被覆盖了。 - kert

1
这个问题已经在pylint-1.0.0中得到解决(请参见Pylint's Changelog):

对于顶级名称赋值,如果pylint可以检测到右侧的值是一个类(例如collections.namedtuple()),则将使用类名正则表达式。

请注意,namedtuple必须在顶层中定义,如果在函数内部定义,pylint仍会给出invalid-name警告。

0

在这种情况下,Pylint 应该检测到名称被分配给了一个类,并使用类名正则表达式。

请在 http://bitbucket.org/logilab/pylint 上提交一个工单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接