<p>有几种不同的方法可以做到这一点。在</p>
<p>如果您可以只使用自定义类(您可以编写)作为可索引容器,那么您只需调整代码并删除“int”类型参数:</p>
<pre><code>class IndexableContainer(Generic[ReturnType]):
def __getitem__(self, key: int) -> ReturnType:
...
class MyCustomContainer(IndexableContainer[ReturnType]):
def __getitem__(self, key: int) -> ReturnType:
# Implementation here
def requires_indexable_container(container: IndexableContainer[ReturnType]) -> ReturnType:
# Code using container here
</code></pre>
<p>当然,问题是,如果您想将一个普通的旧列表传递到函数中,那么您将无法这样做,因为list没有您的自定义类型的子类。在</p>
<p>我们可以通过巧妙地使用<code>@overload</code>修饰符和联合来对某些输入进行特殊处理,但是还有另一种方法,尽管是实验性的,称为<a href="http://mypy.readthedocs.io/en/latest/class_basics.html#simple-user-defined-protocols" rel="nofollow noreferrer">Protocols</a>。在</p>
<p>协议基本上允许您使用类型提示以一种理智的方式表示“duck typing”:基本思想是我们可以调整IndexableContainer,使其成为一个协议。现在,任何使用适当的签名实现<code>__getitem__</code>方法的对象都被视为有效的IndexableContainer,不管它们是否是该类型的子类。在</p>
<p>唯一需要注意的是,协议目前是实验性的,(afaik)只有mypy支持。计划是最终将协议添加到一般的Python生态系统中,具体建议请参见<a href="https://www.python.org/dev/peps/pep-0544/" rel="nofollow noreferrer">PEP 544</a>,但我没有跟踪讨论/不知道这是什么状态。在</p>
<p>在任何情况下,要使用协议,请使用pip安装<code>typing_extensions</code>模块。然后,可以执行以下操作:</p>
^{pr2}$