Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyCharm中带有类型暗示的奇怪行为_Python_Python 3.x_Pycharm_Python Typing - Fatal编程技术网

Python PyCharm中带有类型暗示的奇怪行为

Python PyCharm中带有类型暗示的奇怪行为,python,python-3.x,pycharm,python-typing,Python,Python 3.x,Pycharm,Python Typing,假设我有一个函数,做点什么: from typing import * def do_something(argument: Sequence[Tuple[int, str]]): pass 假设我还有一个字典D,它的键都是int,值都是字符串: D = {1: 'a', 2: 'b', 3: 'c'} 在PyCharm中,这将以优异的成绩通过类型检查器: do_something( ((1, 'a'), (2, 'b'), (3, 'c')) ) 但是,根据PyChar

假设我有一个函数,做点什么:

from typing import *

def do_something(argument: Sequence[Tuple[int, str]]):
    pass
假设我还有一个字典D,它的键都是int,值都是字符串:

D = {1: 'a', 2: 'b', 3: 'c'}
在PyCharm中,这将以优异的成绩通过类型检查器:

do_something(
    ((1, 'a'), (2, 'b'), (3, 'c'))
)
但是,根据PyCharm的说法,尽管其产生的内容相同,但类型检查失败:

do_something(tuple(D.items()))

这是预期的行为吗?我是不是遗漏了什么或者这是PyCharm类型检查器的错误?

PyCharm不能保证
D
的类型确实是
Dict[str,int]
;它可能不会进行代码流分析,以确保没有任何东西不能将非
(str,int)
对添加到dict中(顺便说一句,您应该看看Python的“规范”类型检查器Mypy是否可以)

您可以添加显式类型注释,看看这是否有帮助

D: Dict[str, int] = {1: 'a', 2: 'b', 3: 'c'}
这是PyCharm中的一个bug。 有许多类似的bug,例如

总的来说,PyCharm在这方面相当聪明。它正确地推断出您案例中的
D
类型。它还正确地推断出
D.items()
,然后在类似
的代码中为k,v在D.items()
中,将正确地推断出
k
v
。但出于某种奇怪的原因,
元组
/
列表
/
排序
D.items()
周围的东西有问题


我总是会报告一个问题,告诉你什么时候它会起作用。

这很有道理,谢谢。是的--我尝试显式地指定字典的键和值始终是一致的类型。不幸的是,没有做任何事(虽然这显然不是一个大问题)。如果添加显式类型没有帮助,那么对于
x
Dict[K,V]
是一个
Sequence[tuple[K,V]]
,可能没有隐式或显式类型表示
tuple(x.items())
。是的,我认为这是一个更深层次的问题。我尝试将函数本身中的类型提示调整为:
def DoSomething(参数:Sequence[Tuple[Any,Any]]):pass
,但问题仍然存在。无论给定字典的键和值的类型是什么,在我看来,tuple(Dict.items())的类型始终是Sequence[tuple[any,any]]。所以这对我来说没有逻辑意义。嗯。。。试试
Iterable[Tuple[K,V]]
-我认为
序列应该是可索引的,但是
.items()
es肯定不是。仍然是否定的!从我在另一个答案中提到的例子来看,它看起来可能只是一个PyCharm bug。我仍然很想知道Mypy是否适合这个问题。