皮林特抱怨 "no value for argument 'cls'"

Pylint complains "no value for argument 'cls'"

我定义了以下 class 方法来从 pandas.DataFrame 而不是像这样的列表中定义我的对象:

class Container(object):
    @classmethod
    def from_df(cls, df):
        rows = [i for _, i in df.iterrows()]
        return cls(rows)

pylintreturn 行抱怨 E1120 'code-smell':

No value for argument 'cls' in constructor call

我看不出有什么问题,而且它似乎有效。其他人是否知道它可能有什么问题?

Update:呃,用户 rogalski 明白了(我想):我对一个 class 使用相同的变量名感到困惑作为参数:

def __init__(self, iterable, cls):
    self.content = [cls(item) for item in iterable]

我这样做是因为我有不同类型的对象进来,这个容器 class 是这个女儿的抽象版本:

class FanContainer(Container):
    def __init__(self, iterable):
        super().__init__(iterable, Fan)

其中 Fan 是需要 'contained' 的几个 class 之一。 Rogalski,想写一个类似错误可能引用 __init__ 构造函数名称的答案吗?干杯! (现在我必须深入了解为什么我的代码没有被这个绊倒...)

更新2 才意识到我的编码有多无力:我基本上是这样使用的:

fancontainer = FanContainer.from_df(df)

并且因为我覆盖了 FanContainer class 中的 __init__,我想这就是我的代码仍然有效的原因吧?所以,抽象 __init__ 永远不会被直接调用,因为我从不调用 Container.from_df(df) 而只调用子 classes 的 class 方法。猜猜可以用不同的方式做得更漂亮。

通常此错误与非投诉函数签名有关。

鉴于您的代码:

class Container(object):
    def __init__(self, iterable, cls):
        self.content = [cls(item) for item in iterable]

    @classmethod
    def from_df(cls, df):
        rows = [i for _, i in df.iterrows()]
        return cls(rows)

Pylint 将 from_df 范围对象中的 cls 解析为 Container。 Class 对象是可调用对象(如函数),它们 return 给定 class 的新实例。 Pylint 调查构造函数接口并检查传递的参数是否正确。

在您的情况下,传递的参数不正确 - 缺少第二个必需的参数(恰好具有相同的名称 - cls - 但它存在于不同的分数中)。 Pylint 产生错误的原因是什么。

跟进您的编辑: Pylint 不会 运行 你的代码。它对其进行静态分析。由于可以像 Container.from_df 那样调用它,因此 PyLint 会警告可能的误用。

如果构造函数从未打算在子classes 之外使用两个参数,您可以传递默认参数并显式引发异常:

class Container(object):
    def __init__(self, iterable, cls=None):
        if cls is None:
            raise NotImplementedError()
        self.content = [cls(item) for item in iterable]

    @classmethod
    def from_df(cls, df):
        rows = [i for _, i in df.iterrows()]
        return cls(rows)