Pylint 抱怨“参数‘cls’没有价值”

K.-*_*Aye 5 python pylint pandas

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

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

pylintreturn带有 E1120 '代码气味'的线路上抱怨:

构造函数调用中参数“cls”没有值

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

更新:呃,用户rogalski明白了(我认为):我对作为参数传入的类使用相同的变量名让自己感到困惑:

def __init__(self, iterable, cls):
    self.content = [cls(item) for item in iterable]
Run Code Online (Sandbox Code Playgroud)

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

class FanContainer(Container):
    def __init__(self, iterable):
        super().__init__(iterable, Fan)
Run Code Online (Sandbox Code Playgroud)

Fan被需要是几类的一个“包含”。Rogalski,想写一个类似说错误可能引用__init__构造函数名称的答案吗?干杯! (现在我必须挖掘为什么我的代码没有绊倒这个......)

更新 2 只知道我对这个编码有多弱:我基本上是这样使用它的:

fancontainer = FanContainer.from_df(df)
Run Code Online (Sandbox Code Playgroud)

并且因为我__init__FanContainer课堂上覆盖了,我想这就是为什么我的代码仍然有效?因此,__init__永远不会直接调用抽象,因为我从不调用,Container.from_df(df)而只调用子类的类方法。猜猜这可以用不同的方式做得更漂亮。

Łuk*_*ski 7

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

鉴于您的代码:

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)
Run Code Online (Sandbox Code Playgroud)

pylint的做出决议clsfrom_df范围对象是Container。类对象是可调用的(如函数),它们返回给定类的新实例。Pylint 调查构造函数接口并检查传递的参数是否正确。

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

跟进您的编辑:Pylint 不会运行您的代码。它静态地分析它。因为它可以像Container.from_dfPyLint那样调用它会警告可能的误用。

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

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)
Run Code Online (Sandbox Code Playgroud)