<p>我认为出现错误是因为类型检查器没有足够的信息通过查看输入参数的类型来推断返回类型。尽管操纵性能可能会有所改善</p>
<p>假设您有一个简单的泛型函数:</p>
<pre><code>Enums = TypeVar("Enums", Enum1, Enum2)
def add(x: Enums, y: Enums) -> Enums:
return x
</code></pre>
<p>类型检查器可以通过输入参数的类型推断返回类型:</p>
<pre><code>add(Enum2.MEMBER3, Enum2.MEMBER4) # ok, return Enum2
add(Enum1.MEMBER1, Enum1.MEMBER2) # ok, return Enum1
add(Enum2.MEMBER3, Enum1.MEMBER2) # not ok
</code></pre>
<p>再次查看函数<code>_enum_to_num</code>,类型检查器无法推断返回类型,它只是不知道将返回什么类型,因为它不知道<code>cast_enum</code>将返回什么类型:</p>
<pre><code>def _enum_to_num(val: int, cast_enum: EnumMeta) -> Enums:
return cast_enum(val)
</code></pre>
<p>静态类型检查的思想是,它在不执行的情况下评估代码,它调查变量的<em>类型</em>,而不是动态<em>值</em>。通过查看<code>cast_enum</code>的类型,即<code>EnumMeta</code>,类型检查器无法判断<code>cast_enum</code>是否返回<code>Enums</code>。看起来它只是假设它将返回<code>Enum1</code>,并在<code>_enum_to_num(val, Enum2)</code>中导致错误</p>
<p>您知道<code>_enum_to_num(val, Enum2)</code>将返回<code>Enum2</code>,因为您知道<code>cast_enum</code>的<em>值</em>是<code>Enum2</code>。<em>值</em>是<em>类型</em>检查器通常不涉及的内容。变量<code>cast_enum</code>的<em>值</em>是<code>Enum2</code>,而<code>cast_enum</code>的<em>类型</em>是<code>EnumMeta</code>,尽管<code>Enum2</code>是<em>类型</em></p>
<p>通过告诉类型检查器将使用<a href="https://docs.python.org/3/library/typing.html#typing.Type" rel="nofollow noreferrer">^{<cd19>}</a>通过<code>cast_enum</code>传递类型,可以解决此问题:</p>
<pre><code>from typing import TypeVar, Union, Type
...
def _enum_to_num(val: int, cast_enum: Type[Enums]) -> Enums:
return cast_enum(val)
</code></pre>
<p>错误将消失,因为现在类型检查器可以推断返回类型</p>