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 新手,所以我认为这可能缺乏标准化。
我应该如何改进它?
这不是特定于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 检查有时会给出误报。这并不奇怪,您有时不得不忽略它引发的检查错误。
另一方面,我想指出,您可能希望涵盖以IntTuple与tuple.
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)
| 归档时间: |
|
| 查看次数: |
2663 次 |
| 最近记录: |