【问题标题】:How to formulate pylint rule to allow private variable starting with `__`如何制定 pylint 规则以允许以 `__` 开头的私有变量
【发布时间】:2020-12-26 07:57:59
【问题描述】:

基本上我有一个带有私有变量的类:

class MyClass:
   def __init__(self, abAb):
      self.__abAb = abAb

现在,pylint 抱怨:

Attribute name "__abAb" doesn't conform to camelCase naming style

Python 并不真正了解私有变量,但据我所知,它可以通过添加两个下划线来实现。但是,现在我遇到了问题,即 pylint 抱怨并且我还没有找到一种优雅的方法来禁用该消息,而:

  • 我不想在每次出现时都隐藏消息。
  • 我在.pylintrc 中指定了正则表达式以允许使用下划线,但这样就不可能非常严格地执行驼峰式。
  • 我一般不想禁用名称检查。

还有其他方法可以允许这样的名称吗?类似于 pylint 规则“__camelCase”,我可以将其应用于class-attributes?还是另一种“内置”pythonic 方式?

其实pylint改成snake_case命名约定后就不再抱怨了:

class MyClass:
   def __init__(self, ab_ab):
      self.__ab_ab = ab_ab

这有点奇怪,但这就是我想要的。所以我将使用snake_case 命名属性和方法。

编辑:从camelCase 更改为snake_case 实际上解决了pylint 的问题。

【问题讨论】:

  • 您的问题有一个矛盾之处,即您要求一种“pythonic”方式来实现非pythonic命名约定......
  • @sabik:不,我在问一种如何在不让 pylint 抱怨命名风格的情况下使内部结构私有化的方法。也许答案是 Pythonic 的方式是公开,从不私有。我承认这并不令人满意。
  • pythonic的方式是使用snake_case作为属性名...
  • @sabik:我想知道命名风格如何强烈地属于一种语言。没关系,我会坚持使用snake_case,如果它可以为我节省一些其他的东西
  • 它是PEP8 的一部分; PEP8 是用于发布过去 20 年 Python 语言本身的更改和其他核心信息的同一系列文档的一部分。

标签: python oop pylint information-hiding


【解决方案1】:

下划线,除了常量,不属于驼峰式,所以没有一个好的内置方法来实现这一点。话虽如此,您可以使用模式__[a-z]+[A-Z0-9]+attr-rgx 添加到您的.pylintrc,但这会混合命名样式,因此如果完全可以避免的话,可能不是您想要采取的方法。

理想情况下,对于 python,您将根据官方的 PEP8 首选命名样式使用 snake_case,用于除类名之外的几乎所有内容。

请记住,命名约定只是约定,而且大多是主观的,您的代码仍然可以工作,只是会散发出难闻的“味道”。对于库和 api,使用非常规的命名约定可能会降低潜在用户集成您的代码的可能性,因此它实际上可能不利于您的项目的成功。

【讨论】:

  • 双下划线用于名称修改,而不仅仅是一种约定,因此如果奇怪的话,将attr-rgx 用作(__)?[a-z]+[A-Z0-9]+ 是可以理解的......
  • 我同意@sabik 的观点,开头的下划线只是可选的。无论如何,这并没有改变它不够强大,这就是我最初的意思。也许我的问题应该是对python('向语言添加信息隐藏')和pylint('支持信息隐藏')的功能请求。对我来说,这是 OOP 的一个核心特性,因为我想保护用户对外部不知道的内部变量进行更改,这可能会导致混乱。对我来说,这比强制命名风格重要得多。
  • 是的,但这与 python 哲学背道而驰。可以隐藏信息(例如在闭包中),但这不是 Python 的方法。语言也不太可能改变。
  • snake_case 实际上解决了以下划线开头的属性的 pylint 消息如果你能早点提到这一点,我会很高兴。我的目标并不是真正坚持camelCase,我只是从那个开始,不知道这不是“标准”。当我运行 pylint 时,我发现了。然后我重新配置它来检查camelCase。然而,最后我只是很生气,为什么这么流行的语言不能很好地支持信息隐藏,并且如果试图应用或多或少糟糕的方式来隐藏信息,linter 会抱怨名称样式。
猜你喜欢
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2017-04-01
  • 2014-12-21
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多