Pylint抱怨"没有价值的论点' cls'"

时间:2016-02-04 18:09:34

标签: python pandas pylint

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

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

pylintreturn行上抱怨E1120'代码闻到':

  

没有参数的价值' cls'在构造函数调用中

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

更新:呃,用户rogalski得到了它(我认为):我为一个以参数形式出现的类使用相同的变量名称而感到困惑:

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

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

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

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

UPDATE2 只知道我已经编码过多么虚弱:我基本上就是这样使用它:

fancontainer = FanContainer.from_df(df)

因为我正在覆盖__init__课程中的FanContainer,我想这就是为什么我的代码仍有效?因此,抽象__init__永远不会被直接调用,因为我从不调用Container.from_df(df)而只调用子类' classmethods。猜猜可以用不同的方式做得更漂亮。

1 个答案:

答案 0 :(得分:3)

通常,此错误与非投诉功能签名有关。

鉴于你的代码:

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将cls范围对象中的from_df解析为Container。类对象是可调用对象(如函数),它们返回给定类的新实例。 Pylint调查构造函数接口并检查传递的参数是否正确。

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

跟进您的修改: Pylint不运行您的代码。它静态分析它。因为可以像Container.from_df那样调用它,PyLint会警告可能的误用。

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

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)