Repository navigation
v1.22.0 (pyright 1.1.389)
What's Changed
improved narrowing for generic types
when narrowing a type using an isinstance check, there's no way for the type checker to narrow its type variables, so pyright just narrows them to "Unknown":
def foo(value: object):
if isinstance(value, list):
reveal_type(value) # list[Unknown]this makes sense in cases where the generic is invariant and there's no other way to represent any of its possibilities. for example if it were to be narrowed to list[object], you wouldn't be able to assign list[int] to it. however in cases where the generic is covariant, contravariant, or uses constraints, it can be narrowed more accurately.
this release introduces the new strictGenericNarrowing setting to address this:
class Foo[T_co, T_contra]:
def foo(self, value: T_contra) -> T_co: ...
def foo(value: object):
if isinstance(value, Foo):
reveal_type(value) # previously `Foo[Any, Any]`, now `Foo[object, Never]`for more information, see the docs.
huge thanks to @beauxq for the help on this. implemented in #745
new diagnostic rule - reportExplicitAny
similar to reportAny, however this rule bans usages of the Any type itself rather than expressions that are typed as Any:
def foo(baz: Any) -> Any: # error: reportExplicitAny
print(baz) # error: reportAnyimplemented in #83
other changes
- Chinese (Simplified) localization update (2024.11) by @NCBM in #879
- Fix duplicated
strictListInferencein the docs by @rbrgmn in #888 - show
Neverinstead ofNoReturnwhen it's inferred as the return type of a function by @peacewalker122 in #895 - document
NeverandNoReturnby @DetachHead in #899
New Contributors
- @rbrgmn made their first contribution in #888
- @peacewalker122 made their first contribution in #895
Full Changelog: v1.21.1...v1.22.0