PyCharm 中 __new__ 的调用参数不正确

Aur*_*ier 4 python pycharm

class IntTuple(tuple):
    def __new__(cls, iterable):
        generator = (x for x in iterable if isinstance(x, int) and x > 0)
        return super().__new__(cls, generator)
Run Code Online (Sandbox Code Playgroud)

Pycharm建议我删除generator这是在return。为什么?

它说: 该检查报告声明的参数和实际参数之间存在差异,以及不正确的参数(例如重复命名参数)和不正确的参数顺序。装饰器也被分析。

但它的输出是我所期望的。

例子:

t = IntTuple([1, -1, "abc", 2, [1, 2], 3])

print(t)
Run Code Online (Sandbox Code Playgroud)
output: (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

我是 Python 新手,所以我认为这可能缺乏标准化。

我应该如何改进它?

Oli*_*çon 5

这不是特定于tuple,调用大多数内置类型的特殊方法会导致PyCharm与类型签名混淆。

str.__new__(str, 'foo') # This will confuse PyCharm even though it is correct
Run Code Online (Sandbox Code Playgroud)

PyCharm 解析tuple.__new__为继承自builtins.object.__new__. 这不是用于创建元组的真正方法,但它无法找到正确的方法(.py因为它是用 C 编写的,所以它不在文件中)。

元组.__新__

这很可能是一个错误,不幸的是,这不是您可以通过设置修复的问题,除非禁用我不推荐的错误调用参数检查。

最重要的是,由于必须检查动态类型语言,PyCharm 检查有时会给出误报。这并不奇怪,您有时不得不忽略它引发的检查错误。

关于你的代码的一句话

另一方面,我想指出,您可能希望涵盖以IntTupletuple.

tuple() # ()
Run Code Online (Sandbox Code Playgroud)

为此,您可以有一个默认的iterable.

class IntTuple(tuple):
    def __new__(cls, iterable=()):
        generator = (x for x in iterable if isinstance(x, int) and x > 0)
        return super().__new__(cls, generator)

IntTuple() # ()
Run Code Online (Sandbox Code Playgroud)