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
中的return
。为什么呢?
它说:此检查报告声明的参数和实际参数之间的差异,以及不正确的参数(例如重复的命名参数)和不正确的参数顺序。装饰师也被分析了。
但它的输出是我的预期。
示例:
t = IntTuple([1, -1, "abc", 2, [1, 2], 3])
print(t)
output: (1, 2, 3)
我是Python的新手,所以我认为这可能缺乏标准化。
我该如何改进?
答案 0 :(得分:3)
这不是tuple
特有的,调用大多数内置类型的特殊方法会导致 PyCharm 与类型签名混淆。
str.__new__(str, 'foo') # This will confuse PyCharm even though it is correct
PyCharm将tuple.__new__
解析为继承自builtins.object.__new__
。这不是用于创建元组的真正方法,但它找不到正确的方法(它不在.py
文件中,因为它是用C语言编写的。)
这很可能是一个错误,不幸的是,这不是你可以通过设置解决的问题,除非禁用不正确的调用参数检查我不建议。
最重要的是,由于必须检查动态类型语言,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() # ()
答案 1 :(得分:-2)
这是因为tuple
的{{1}}方法接受参数__new__
。
您可能找到了可以使用__new__(*args, **kwargs)
构建tuple
实例的文档,以使用初始值预填充元组。此tuple(iterable)
是iterable
类的__init__
方法的参数,而不是tuple
方法。
我认为你打算使用的是__new__
而不是__init__
。在Python中,__new__
方法主要用于元编程。可以将__new__
方法视为构造函数,就像在其他语言中使用它一样。 __init__
方法用于创建类的实例,因此您需要构造__new__
并返回该实例。例如,您可以使用object
来实现单例模式,方法是始终返回相同的静态对象。 __new__
方法只是在创建实例后对其进行初始化,就像普通构造函数一样。
所以你要使用像:
这样的东西__init__