我已经定义了以下类方法来从pandas.DataFrame定义我的对象而不是像这样的列表:
class Container(object):
@classmethod
def from_df(cls, df):
rows = [i for _, i in df.iterrows()]
return cls(rows)
和pylint
在return
行上抱怨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。猜猜可以用不同的方式做得更漂亮。
答案 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)