gpt4 book ai didi

python - Pylint 提示 "no value for argument ' cls'”

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:47 26 4
gpt4 key购买 nike

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

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

pylintreturn 行提示 E1120 'code-smell':

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__ 构造函数的名称?干杯! (现在我必须深入了解为什么我的代码没有绊倒这个......)

更新2才意识到我的编码有多无力:我基本上是这样使用它的:

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 调查构造函数接口(interface)并检查传递的参数是否正确。

在您的情况下,传递的参数不正确 - 缺少第二个必需参数(恰好具有相同的名称 - 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)

关于python - Pylint 提示 "no value for argument ' cls'”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35208443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com