【问题标题】:How to define a method in the superclass so that it will be compatible with any subclass?如何在超类中定义方法以使其与任何子类兼容?
【发布时间】:2014-11-20 17:07:36
【问题描述】:

我有几节课:

class Sup:
    def meth (self, ?????):
        pass

class Sub1(Sup):
    def meth (self, foo = 1):
        ...

class Sub2(Sup):
    def meth (self, bar = 2, baz = 3):
        ...

我应该用什么替换Sup.meth 中的?????

基本上,我想要类似于 Lisp 中被忽略的 &rest lambda-list 关键字的东西来安抚arguments-differ/Arguments number differs from overridden method 警告。

我尝试了什么:

  1. **kwargs 添加到Sup.meth - 没有任何改变
  2. # pylint: disable=arguments-differ 注释Sub*.meth - 有效,但丑陋。

PS。 Sup 是一个收集统计数据的抽象类; Sub* 是不同的方法; meth 用不同的花里胡哨打印对象。

【问题讨论】:

  • 您是否从任何子类调用Sup.meth? Python 不会为被覆盖的方法强制使用相同的签名,所以我并不完全清楚问题是什么。
  • 我从不打电话给Sup.meth;我只想安抚pylint
  • 一个选择是# pylint: disable=arguments-differ!您可以将**kwargs 用于“任意关键字参数”pylint 是否会接受我现在无法检查。
  • adding **kwargs to Sup.meth - did not work 更明确一点?
  • 鉴于他们似乎采取了不相关的论点,他们真的应该是同一种方法吗?在超类和子类上拥有一个方法的重点是调用它的代码不必关心它有什么特定的实例。如果有不同的论点,这是不正确的。你能提供一个不那么抽象的例子吗?

标签: python class inheritance


【解决方案1】:

我发现 pylint 对许多 Python 特性有……不同寻常的看法。它认为some_function(*list_of_args) 是“坏魔法”,例如 (W0124)。

当您和 pylint 将永远就“问题”达成一致时,解决方案不是代码中奇怪的 cmets,而是在 ~/.pylintrc 中永久消除该消息。 (pylint --generate-rcfile 会输出一个示例配置文件,您可以自己编辑。)在那里,您可以设置:

  • 故意未使用变量的正则表达式:dummy-variables-rgx=_$|__$

  • 变量、类和常量名称的正则表达式:function-rgx=[a-z_][a-z0-9_]{0,30}$

  • 忽略单个警告或整个消息类别(“IRCWEF”之一):disable=I0011,W0142,R

~/.pylintrc 是我发现您可以禁用某些东西的唯一方式 --- 例如“I0011: "Locally disabling %s"”,因为本地静音 I0011 本身会生成另一个 I0011 消息(这完全是虐待狂) .

对于项目,我通常会创建一个单行 shell 脚本来进一步禁用我不打算修复的内容:

#!/bin/bash

pylint --output=colorized --disable=C0103 *.py | less -R -
#  :C0103 (invalid-name): *Invalid name "%s" for type %s (should match %s)*

翻译:“我已经知道前一个人有他自己的命名约定,所以请不要再告诉我 8000 次。”

【讨论】:

    【解决方案2】:

    您应该查看*args 的位置参数和**kwargs 关键字参数。

    更多信息请点击此处:*args and **kwargs?

    【讨论】:

    • @sds 我想我的回答是你要么建立更严格的类结构,要么忽略警告。 PyLint 会很高兴地抱怨完全有效的代码,因为它违反了一些次要的样式约定。添加**kwargs 半纠正了可读性问题,但它仍然留下了不一致的类接口,PyLint 正确地检测到了这一点。如果这真的很重要,您可能考虑将**kwargs 也用于其他方法。但这有其自身的可读性缺点...... tl;博士:不要与 PyLint 对抗。编写可读的代码。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多