mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
bpo-46491: Allow Annotated on outside of Final/ClassVar (GH-30864)
We treat Annotated type arg as class-level annotation. This exempts it from checks against Final and ClassVar in order to allow using them in any nesting order.
Automerge-Triggered-By: GH:gvanrossum
(cherry picked from commit e1abffca45
)
Co-authored-by: Gregory Beauregard <greg@greg.red>
This commit is contained in:
parent
3178efbf06
commit
b0b8388a1c
3 changed files with 13 additions and 4 deletions
|
@ -134,7 +134,7 @@ def _type_convert(arg, module=None):
|
|||
return arg
|
||||
|
||||
|
||||
def _type_check(arg, msg, is_argument=True, module=None, *, is_class=False):
|
||||
def _type_check(arg, msg, is_argument=True, module=None, *, allow_special_forms=False):
|
||||
"""Check that the argument is a type, and return it (internal helper).
|
||||
|
||||
As a special case, accept None and return type(None) instead. Also wrap strings
|
||||
|
@ -147,7 +147,7 @@ def _type_check(arg, msg, is_argument=True, module=None, *, is_class=False):
|
|||
We append the repr() of the actual value (truncated to 100 chars).
|
||||
"""
|
||||
invalid_generic_forms = (Generic, Protocol)
|
||||
if not is_class:
|
||||
if not allow_special_forms:
|
||||
invalid_generic_forms += (ClassVar,)
|
||||
if is_argument:
|
||||
invalid_generic_forms += (Final,)
|
||||
|
@ -554,7 +554,7 @@ class ForwardRef(_Final, _root=True):
|
|||
eval(self.__forward_code__, globalns, localns),
|
||||
"Forward references must evaluate to types.",
|
||||
is_argument=self.__forward_is_argument__,
|
||||
is_class=self.__forward_is_class__,
|
||||
allow_special_forms=self.__forward_is_class__,
|
||||
)
|
||||
self.__forward_value__ = _eval_type(
|
||||
type_, globalns, localns, recursive_guard | {self.__forward_arg__}
|
||||
|
@ -1336,7 +1336,7 @@ class Annotated:
|
|||
"with at least two arguments (a type and an "
|
||||
"annotation).")
|
||||
msg = "Annotated[t, ...]: t must be a type."
|
||||
origin = _type_check(params[0], msg)
|
||||
origin = _type_check(params[0], msg, allow_special_forms=True)
|
||||
metadata = tuple(params[1:])
|
||||
return _AnnotatedAlias(origin, metadata)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue