我已经定义了以下类方法来从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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。