gpt4 book ai didi

python - PyCharm 中 __new__ 的调用参数不正确

转载 作者:行者123 更新时间:2023-11-28 18:14:18 25 4
gpt4 key购买 nike

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)

Pycharm 建议我删除 return 中的 generator。为什么?

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

但它的输出符合我的预期。

例子:

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

print(t)

output: (1, 2, 3)

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

我应该如何改进它?

最佳答案

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

str.__new__(str, 'foo') # This will confuse PyCharm even though it is correct

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

tuple.__new__

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

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

关于您的代码

另一方面,我想指出的是,您可能希望涵盖创建空 IntTuple 的情况,就像使用 tuple 一样.

tuple() # ()

为此你可以有一个默认的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() # ()

关于python - PyCharm 中 __new__ 的调用参数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49465166/

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