PEP 613: Loosen class scope restriction of explicit TypeAlias (#2154)
Per discussion on typing-sig https://mail.python.org/archives/list/typing-sig@python.org/thread/CGOO7GPPECGMLFDUDXSSXTRADI4BXYCS/ Co-authored-by: CAM Gerlach <CAM.Gerlach@Gerlach.CAM>
This commit is contained in:
parent
4d55ea96be
commit
3ec824affd
29
pep-0613.rst
29
pep-0613.rst
|
@ -95,6 +95,17 @@ across the codebase can be suppressed.
|
||||||
Scope Restrictions:
|
Scope Restrictions:
|
||||||
*******************
|
*******************
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
class Foo:
|
||||||
|
x = ClassName
|
||||||
|
y: TypeAlias = ClassName
|
||||||
|
z: Type[ClassName] = ClassName
|
||||||
|
|
||||||
|
Type aliases are valid within class scope, both implicitly (``x``) and
|
||||||
|
explicitly (``y``). If the line should be interpreted as a class
|
||||||
|
variable, it must be explicitly annotated (``z``).
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
x = ClassName
|
x = ClassName
|
||||||
|
@ -103,7 +114,7 @@ Scope Restrictions:
|
||||||
|
|
||||||
The outer ``x`` is a valid type alias, but type checkers must error if the
|
The outer ``x`` is a valid type alias, but type checkers must error if the
|
||||||
inner ``x`` is ever used as a type because type aliases cannot be defined
|
inner ``x`` is ever used as a type because type aliases cannot be defined
|
||||||
inside a nested scope.
|
inside of a function.
|
||||||
This is confusing because the alias declaration rule is not explicit, and because
|
This is confusing because the alias declaration rule is not explicit, and because
|
||||||
a type error will not be thrown on the location of the inner type alias declaration
|
a type error will not be thrown on the location of the inner type alias declaration
|
||||||
but rather on every one of its subsequent use cases.
|
but rather on every one of its subsequent use cases.
|
||||||
|
@ -116,10 +127,10 @@ but rather on every one of its subsequent use cases.
|
||||||
def bar() -> None:
|
def bar() -> None:
|
||||||
x: TypeAlias = ClassName
|
x: TypeAlias = ClassName
|
||||||
|
|
||||||
With explicit aliases, the outer assignment is still a valid type variable,
|
With explicit aliases, the outer assignment is still a valid type variable.
|
||||||
and the inner assignment can either be a valid local variable or a clear error,
|
Inside ``foo``, the inner assignment should be interpreted as ``x: Type[ClassName]``.
|
||||||
communicating to the author that type aliases cannot be defined inside a nested
|
Inside ``bar``, the type checker should raise a clear error, communicating
|
||||||
scope.
|
to the author that type aliases cannot be defined inside a function.
|
||||||
|
|
||||||
|
|
||||||
Specification
|
Specification
|
||||||
|
@ -200,6 +211,14 @@ appealing because it still sticks with the ``MyType = int`` assignment
|
||||||
syntax, and adds some information for the type checker purely as an annotation.
|
syntax, and adds some information for the type checker purely as an annotation.
|
||||||
|
|
||||||
|
|
||||||
|
Version History
|
||||||
|
===============
|
||||||
|
|
||||||
|
* 2021-11-16
|
||||||
|
|
||||||
|
* Allow TypeAlias inside class scope
|
||||||
|
|
||||||
|
|
||||||
Copyright
|
Copyright
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue