PyCharm中的“new”的调用参数不正确

2024-09-30 03:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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建议我删除generator,它位于{}中。为什么?在

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

但它的产量是我所期望的。在

示例:

^{pr2}$
output: (1, 2, 3)

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

我应该如何改进它?在


Tags: andinnewfor参数ifdefiterable
2条回答

这不是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__

这很可能是一个bug,不幸的是,这不是您可以通过设置来修复的,除非通过禁用不正确的调用参数检查,我不建议这样做。在

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

你的密码上有一个字

{{cd5>你可能想用另一个点来覆盖它。在

^{pr2}$

为此,您可以使用默认的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() # ()

它这样说是因为tuple__new__方法接受参数__new__(*args, **kwargs)。在

您可能已经找到了一些文档,可以使用tuple(iterable)构造一个tuple实例,用初始值预填充元组。这个iterabletuple类的__init__方法的参数,而不是__new__方法的参数。在

我想你想用的是__init__而不是{}。在Python中,__new__方法主要用于元编程。可以将__init__方法视为构造函数,就像在其他语言中使用它一样。__new__方法用于创建类的实例,因此您需要构造一个object并返回该实例。例如,您可以使用__new__来实现singleton模式,方法是始终返回相同的静态对象。__init__方法只是在实例创建之后初始化它,就像普通构造函数那样。在

所以你会用一些类似的东西:

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

相关问题 更多 >

    热门问题