python – Pylint抱怨“没有价值论证’cls’”

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

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

和pylint在返回线上抱怨E1120’代码味道’:

No value for argument ‘cls’ in constructor call

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

更新:呃,用户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)

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

解决方法:

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

鉴于您的代码

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.类对象是可调用对象(如函数),它们返回给定类的新实例. 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)

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...