皮林特抱怨 "no value for argument 'cls'"
Pylint complains "no value for argument 'cls'"
我定义了以下 class 方法来从 pandas.DataFrame 而不是像这样的列表中定义我的对象:
class Container(object):
@classmethod
def from_df(cls, df):
rows = [i for _, i in df.iterrows()]
return cls(rows)
和 pylint
在 return
行抱怨 E1120 'code-smell':
No value for argument 'cls' in constructor call
我看不出有什么问题,而且它似乎有效。其他人是否知道它可能有什么问题?
Update:呃,用户 rogalski
明白了(我想):我对一个 class 使用相同的变量名感到困惑作为参数:
def __init__(self, iterable, cls):
self.content = [cls(item) for item in iterable]
我这样做是因为我有不同类型的对象进来,这个容器 class 是这个女儿的抽象版本:
class FanContainer(Container):
def __init__(self, iterable):
super().__init__(iterable, Fan)
其中 Fan
是需要 'contained' 的几个 class 之一。
Rogalski,想写一个类似错误可能引用 __init__
构造函数名称的答案吗?干杯! (现在我必须深入了解为什么我的代码没有被这个绊倒...)
更新2
才意识到我的编码有多无力:我基本上是这样使用的:
fancontainer = FanContainer.from_df(df)
并且因为我覆盖了 FanContainer
class 中的 __init__
,我想这就是我的代码仍然有效的原因吧?所以,抽象 __init__
永远不会被直接调用,因为我从不调用 Container.from_df(df)
而只调用子 classes 的 class 方法。猜猜可以用不同的方式做得更漂亮。
通常此错误与非投诉函数签名有关。
鉴于您的代码:
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
。 Class 对象是可调用对象(如函数),它们 return 给定 class 的新实例。 Pylint 调查构造函数接口并检查传递的参数是否正确。
在您的情况下,传递的参数不正确 - 缺少第二个必需的参数(恰好具有相同的名称 - cls
- 但它存在于不同的分数中)。 Pylint 产生错误的原因是什么。
跟进您的编辑:
Pylint 不会 运行 你的代码。它对其进行静态分析。由于可以像 Container.from_df
那样调用它,因此 PyLint 会警告可能的误用。
如果构造函数从未打算在子classes 之外使用两个参数,您可以传递默认参数并显式引发异常:
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)
我定义了以下 class 方法来从 pandas.DataFrame 而不是像这样的列表中定义我的对象:
class Container(object):
@classmethod
def from_df(cls, df):
rows = [i for _, i in df.iterrows()]
return cls(rows)
和 pylint
在 return
行抱怨 E1120 'code-smell':
No value for argument 'cls' in constructor call
我看不出有什么问题,而且它似乎有效。其他人是否知道它可能有什么问题?
Update:呃,用户 rogalski
明白了(我想):我对一个 class 使用相同的变量名感到困惑作为参数:
def __init__(self, iterable, cls):
self.content = [cls(item) for item in iterable]
我这样做是因为我有不同类型的对象进来,这个容器 class 是这个女儿的抽象版本:
class FanContainer(Container):
def __init__(self, iterable):
super().__init__(iterable, Fan)
其中 Fan
是需要 'contained' 的几个 class 之一。
Rogalski,想写一个类似错误可能引用 __init__
构造函数名称的答案吗?干杯! (现在我必须深入了解为什么我的代码没有被这个绊倒...)
更新2 才意识到我的编码有多无力:我基本上是这样使用的:
fancontainer = FanContainer.from_df(df)
并且因为我覆盖了 FanContainer
class 中的 __init__
,我想这就是我的代码仍然有效的原因吧?所以,抽象 __init__
永远不会被直接调用,因为我从不调用 Container.from_df(df)
而只调用子 classes 的 class 方法。猜猜可以用不同的方式做得更漂亮。
通常此错误与非投诉函数签名有关。
鉴于您的代码:
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
。 Class 对象是可调用对象(如函数),它们 return 给定 class 的新实例。 Pylint 调查构造函数接口并检查传递的参数是否正确。
在您的情况下,传递的参数不正确 - 缺少第二个必需的参数(恰好具有相同的名称 - cls
- 但它存在于不同的分数中)。 Pylint 产生错误的原因是什么。
跟进您的编辑:
Pylint 不会 运行 你的代码。它对其进行静态分析。由于可以像 Container.from_df
那样调用它,因此 PyLint 会警告可能的误用。
如果构造函数从未打算在子classes 之外使用两个参数,您可以传递默认参数并显式引发异常:
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)