如何提示python3.6参数必须是大小和可移植的?

如何提示python3.6参数必须是大小和可移植的?,python,python-3.x,type-hinting,Python,Python 3.x,Type Hinting,我有一个函数,它要求参数同时具有大小和可移植性 def foo(items): print(len(items)) for i in item: print(i) 我想我可以使用python3.5+中的标准键入模块编写以下代码: from typing import Collection, Any def foo(items: Collection[Any]): print(len(items)) for i in item:

我有一个函数,它要求参数同时具有大小和可移植性

def foo(items):
    print(len(items))
    for i in item:
        print(i)
我想我可以使用python3.5+中的标准
键入
模块编写以下代码:

from  typing import Collection, Any

def foo(items: Collection[Any]):
    print(len(items))
    for i in item:
        print(i)



foo([1, 2, 3])
# PyCharm warns: Expected type 'Collection', got 'List[int]' instead.
看起来像我需要的:
class-typing.Collection(大小、Iterable[T\u-co]、Container[T\u-co])

为什么会引起警告?

我应该怎么做才能将参数提示为Iterable和Sized?;很可能,你的PyCharm版本还没有识别出来


在3.5中没有描述大小可移植容器的内置函数,因此至少在3.5中不能使用此注释,除非编写自己的
类型,PyCharm可能会也可能不会识别该类型。

让Python3.5满意的一个肮脏修复方法是使用
联合[size,iterable[Any]

它是脏的,因为使用此类型注释表示它应该是Size或iterable,而不是Size和iterable。 当前的Pycharm(2018.1)接受了这一点,并开始运行


更新: 我找到了一种在Python版本<3.6中使用
集合的方法。
3.6之前的
序列
基本上就是3.6中的
集合
(参见和)。在3.6中,
序列
基本上是一个可逆的
集合
(请参阅),这给了我一些问题,因为python
集合
不是序列(它是不可逆的),所以我用以下导入代码对其进行了修补:

if sys.version_info >= (3, 6):
    from typing import Collection
else:
    from typing import Sequence, TypeVar

    T = TypeVar('T')
    Collection = Sequence[T]

集合
确实是大小合适的(另请参见);这可能是PyCharm或它使用的任何插件中的错误。@JimFasarakisHilliard,确实是。我必须先检查一下youtrack。你能建议如何在我自己的类型中加入Sized和Iterable吗?@AlexanderChzhen:最简单的方法是从和(根据需要限定名称)借用代码来创建你自己的
Collection
ABC和
Collection
键入提示类。复制代码将依赖于实现详细信息,因此您可能希望编写尝试获取
typing.Collection
的代码,并且只有在获得
ImportError
时才返回到使用实现详细信息来定义它。