namedpuples是否应遵循python中的常量名称约定?

时间:2013-11-14 08:42:41

标签: python pylint pep8 namedtuple

我写了一个小的python模块,我使用几个命名元组来传递信息,因为我发现它们很有表现力。我考虑了这些类型并按照PEP8类名称(CamelCased)命名它们。然而,pylint看到了这一行:

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

在模块的全局范围内,并且:无效的常量名称'PersonData'。

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

如果答案是抑制警告。这不是pylint与命名元组的反复出现的问题吗?

(使用pylint-0.26.0,python-2.7.4)

4 个答案:

答案 0 :(得分:6)

此问题已在较新版本的pylint中解决。

我的系统正在从ubuntu(13.04)存储库(pylint-0.26.0)中选择版本。 使用virtualenv我可以使用pip install pylint-1.0.0来识别命名元组,并且实际上将使用与类相同的格式强制执行。

请注意,如果您在字段字符串上进行字符串操作,它将不会选择它。例如:

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

仍将导致pylint-1.0.0吐出无效常量名称的错误代码。在这种情况下,唯一的解决方法是根据Martijn Pieters建议禁用警告。

答案 1 :(得分:5)

你可以在这里忽略pylint,你正好使用驼峰案例命名约定。

您可以取消警告:

PersonData = collections.namedtuple('PersonData', 'name surname age')  # pylint: disable-msg=C0103

namedtuple是一个类工厂,因此请使用类的命名约定。

答案 2 :(得分:1)

pylint-1.0.0已修复此问题(请参阅Pylint's Changelog):

  

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

请注意,必须在 toplevel 上定义namedtuple,如果已定义,例如在函数中,pylint仍然会发出invalid-name警告。

答案 3 :(得分:0)

在这种情况下,pylint应该检测名称被分配给一个类使用类名regexp。

请在http://bitbucket.org/logilab/pylint

上提交门票