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
THE END
二维码