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)
并pylint在return带有 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)而只调用子类的类方法。猜猜这可以用不同的方式做得更漂亮。
通常,此错误与非投诉函数签名有关。
鉴于您的代码:
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的做出决议cls在from_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)