Python静态类型提示/检查Iterable[AnyStr]与Iterable[str]之间的不匹配可迭代[字节]

我遇到了这个静态类型提示不匹配(使用 Pyright):

from __future__ import annotations
from typing import AnyStr, Iterable


def foo(i: Iterable[AnyStr]):
    return i


def bar(i: Iterable[str] | Iterable[bytes]):
    return i


def baz(i: Iterable[str | bytes]):
    return i


def main():
    s = ['a']

    # makes sense to me
    baz(foo(s))  # allowed
    foo(baz(s))  # not allowed

    # makes sense to me
    baz(bar(s))  # allowed
    bar(baz(s))  # not allowed

    bar(foo(s))  # allowed
    foo(bar(s))  # nope -- why?

什么之间的区别Iterable[AnyStr]Iterable[str] | Iterable[bytes]

它们不应该是“等效的”吗?(除了AnyStr在上下文中引用单个一致类型)

更具体地说:键入提示以下内容的正确方法是什么?

import random
from typing import Iterable, AnyStr

def foo(i: Iterable[AnyStr]):
    return i

def exclusive_bytes_or_str():  # type-inferred to be Iterator[bytes] | Iterator[str]
    if random.randrange(2) == 0:
        return iter([b'bytes'])
    else:
        return iter(['str'])

foo(iter([b'bytes']))          # fine
foo(iter(['str']))             # fine
foo(exclusive_bytes_or_str())  # same error

以上是Python静态类型提示/检查Iterable[AnyStr]与Iterable[str]之间的不匹配可迭代[字节]的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>