Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/typing_extensions.py: 25%

1216 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-07 06:52 +0000

1import abc 

2import collections 

3import collections.abc 

4import operator 

5import sys 

6import types as _types 

7import typing 

8 

9# After PEP 560, internal typing API was substantially reworked. 

10# This is especially important for Protocol class which uses internal APIs 

11# quite extensively. 

12PEP_560 = sys.version_info[:3] >= (3, 7, 0) 

13 

14if PEP_560: 

15 GenericMeta = type 

16else: 

17 # 3.6 

18 from typing import GenericMeta, _type_vars # noqa 

19 

20 

21# Please keep __all__ alphabetized within each category. 

22__all__ = [ 

23 # Super-special typing primitives. 

24 'ClassVar', 

25 'Concatenate', 

26 'Final', 

27 'LiteralString', 

28 'ParamSpec', 

29 'Self', 

30 'Type', 

31 'TypeVarTuple', 

32 'Unpack', 

33 

34 # ABCs (from collections.abc). 

35 'Awaitable', 

36 'AsyncIterator', 

37 'AsyncIterable', 

38 'Coroutine', 

39 'AsyncGenerator', 

40 'AsyncContextManager', 

41 'ChainMap', 

42 

43 # Concrete collection types. 

44 'ContextManager', 

45 'Counter', 

46 'Deque', 

47 'DefaultDict', 

48 'OrderedDict', 

49 'TypedDict', 

50 

51 # Structural checks, a.k.a. protocols. 

52 'SupportsIndex', 

53 

54 # One-off things. 

55 'Annotated', 

56 'assert_never', 

57 'dataclass_transform', 

58 'final', 

59 'IntVar', 

60 'is_typeddict', 

61 'Literal', 

62 'NewType', 

63 'overload', 

64 'Protocol', 

65 'reveal_type', 

66 'runtime', 

67 'runtime_checkable', 

68 'Text', 

69 'TypeAlias', 

70 'TypeGuard', 

71 'TYPE_CHECKING', 

72 'Never', 

73 'NoReturn', 

74 'Required', 

75 'NotRequired', 

76] 

77 

78if PEP_560: 

79 __all__.extend(["get_args", "get_origin", "get_type_hints"]) 

80 

81# The functions below are modified copies of typing internal helpers. 

82# They are needed by _ProtocolMeta and they provide support for PEP 646. 

83 

84 

85def _no_slots_copy(dct): 

86 dict_copy = dict(dct) 

87 if '__slots__' in dict_copy: 

88 for slot in dict_copy['__slots__']: 

89 dict_copy.pop(slot, None) 

90 return dict_copy 

91 

92 

93_marker = object() 

94 

95 

96def _check_generic(cls, parameters, elen=_marker): 

97 """Check correct count for parameters of a generic cls (internal helper). 

98 This gives a nice error message in case of count mismatch. 

99 """ 

100 if not elen: 

101 raise TypeError(f"{cls} is not a generic class") 

102 if elen is _marker: 

103 if not hasattr(cls, "__parameters__") or not cls.__parameters__: 

104 raise TypeError(f"{cls} is not a generic class") 

105 elen = len(cls.__parameters__) 

106 alen = len(parameters) 

107 if alen != elen: 

108 if hasattr(cls, "__parameters__"): 

109 parameters = [p for p in cls.__parameters__ if not _is_unpack(p)] 

110 num_tv_tuples = sum(isinstance(p, TypeVarTuple) for p in parameters) 

111 if (num_tv_tuples > 0) and (alen >= elen - num_tv_tuples): 

112 return 

113 raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};" 

114 f" actual {alen}, expected {elen}") 

115 

116 

117if sys.version_info >= (3, 10): 

118 def _should_collect_from_parameters(t): 

119 return isinstance( 

120 t, (typing._GenericAlias, _types.GenericAlias, _types.UnionType) 

121 ) 

122elif sys.version_info >= (3, 9): 

123 def _should_collect_from_parameters(t): 

124 return isinstance(t, (typing._GenericAlias, _types.GenericAlias)) 

125else: 

126 def _should_collect_from_parameters(t): 

127 return isinstance(t, typing._GenericAlias) and not t._special 

128 

129 

130def _collect_type_vars(types, typevar_types=None): 

131 """Collect all type variable contained in types in order of 

132 first appearance (lexicographic order). For example:: 

133 

134 _collect_type_vars((T, List[S, T])) == (T, S) 

135 """ 

136 if typevar_types is None: 

137 typevar_types = typing.TypeVar 

138 tvars = [] 

139 for t in types: 

140 if ( 

141 isinstance(t, typevar_types) and 

142 t not in tvars and 

143 not _is_unpack(t) 

144 ): 

145 tvars.append(t) 

146 if _should_collect_from_parameters(t): 

147 tvars.extend([t for t in t.__parameters__ if t not in tvars]) 

148 return tuple(tvars) 

149 

150 

151# 3.6.2+ 

152if hasattr(typing, 'NoReturn'): 

153 NoReturn = typing.NoReturn 

154# 3.6.0-3.6.1 

155else: 

156 class _NoReturn(typing._FinalTypingBase, _root=True): 

157 """Special type indicating functions that never return. 

158 Example:: 

159 

160 from typing import NoReturn 

161 

162 def stop() -> NoReturn: 

163 raise Exception('no way') 

164 

165 This type is invalid in other positions, e.g., ``List[NoReturn]`` 

166 will fail in static type checkers. 

167 """ 

168 __slots__ = () 

169 

170 def __instancecheck__(self, obj): 

171 raise TypeError("NoReturn cannot be used with isinstance().") 

172 

173 def __subclasscheck__(self, cls): 

174 raise TypeError("NoReturn cannot be used with issubclass().") 

175 

176 NoReturn = _NoReturn(_root=True) 

177 

178# Some unconstrained type variables. These are used by the container types. 

179# (These are not for export.) 

180T = typing.TypeVar('T') # Any type. 

181KT = typing.TypeVar('KT') # Key type. 

182VT = typing.TypeVar('VT') # Value type. 

183T_co = typing.TypeVar('T_co', covariant=True) # Any type covariant containers. 

184T_contra = typing.TypeVar('T_contra', contravariant=True) # Ditto contravariant. 

185 

186ClassVar = typing.ClassVar 

187 

188# On older versions of typing there is an internal class named "Final". 

189# 3.8+ 

190if hasattr(typing, 'Final') and sys.version_info[:2] >= (3, 7): 

191 Final = typing.Final 

192# 3.7 

193elif sys.version_info[:2] >= (3, 7): 

194 class _FinalForm(typing._SpecialForm, _root=True): 

195 

196 def __repr__(self): 

197 return 'typing_extensions.' + self._name 

198 

199 def __getitem__(self, parameters): 

200 item = typing._type_check(parameters, 

201 f'{self._name} accepts only single type') 

202 return typing._GenericAlias(self, (item,)) 

203 

204 Final = _FinalForm('Final', 

205 doc="""A special typing construct to indicate that a name 

206 cannot be re-assigned or overridden in a subclass. 

207 For example: 

208 

209 MAX_SIZE: Final = 9000 

210 MAX_SIZE += 1 # Error reported by type checker 

211 

212 class Connection: 

213 TIMEOUT: Final[int] = 10 

214 class FastConnector(Connection): 

215 TIMEOUT = 1 # Error reported by type checker 

216 

217 There is no runtime checking of these properties.""") 

218# 3.6 

219else: 

220 class _Final(typing._FinalTypingBase, _root=True): 

221 """A special typing construct to indicate that a name 

222 cannot be re-assigned or overridden in a subclass. 

223 For example: 

224 

225 MAX_SIZE: Final = 9000 

226 MAX_SIZE += 1 # Error reported by type checker 

227 

228 class Connection: 

229 TIMEOUT: Final[int] = 10 

230 class FastConnector(Connection): 

231 TIMEOUT = 1 # Error reported by type checker 

232 

233 There is no runtime checking of these properties. 

234 """ 

235 

236 __slots__ = ('__type__',) 

237 

238 def __init__(self, tp=None, **kwds): 

239 self.__type__ = tp 

240 

241 def __getitem__(self, item): 

242 cls = type(self) 

243 if self.__type__ is None: 

244 return cls(typing._type_check(item, 

245 f'{cls.__name__[1:]} accepts only single type.'), 

246 _root=True) 

247 raise TypeError(f'{cls.__name__[1:]} cannot be further subscripted') 

248 

249 def _eval_type(self, globalns, localns): 

250 new_tp = typing._eval_type(self.__type__, globalns, localns) 

251 if new_tp == self.__type__: 

252 return self 

253 return type(self)(new_tp, _root=True) 

254 

255 def __repr__(self): 

256 r = super().__repr__() 

257 if self.__type__ is not None: 

258 r += f'[{typing._type_repr(self.__type__)}]' 

259 return r 

260 

261 def __hash__(self): 

262 return hash((type(self).__name__, self.__type__)) 

263 

264 def __eq__(self, other): 

265 if not isinstance(other, _Final): 

266 return NotImplemented 

267 if self.__type__ is not None: 

268 return self.__type__ == other.__type__ 

269 return self is other 

270 

271 Final = _Final(_root=True) 

272 

273 

274if sys.version_info >= (3, 11): 

275 final = typing.final 

276else: 

277 # @final exists in 3.8+, but we backport it for all versions 

278 # before 3.11 to keep support for the __final__ attribute. 

279 # See https://bugs.python.org/issue46342 

280 def final(f): 

281 """This decorator can be used to indicate to type checkers that 

282 the decorated method cannot be overridden, and decorated class 

283 cannot be subclassed. For example: 

284 

285 class Base: 

286 @final 

287 def done(self) -> None: 

288 ... 

289 class Sub(Base): 

290 def done(self) -> None: # Error reported by type checker 

291 ... 

292 @final 

293 class Leaf: 

294 ... 

295 class Other(Leaf): # Error reported by type checker 

296 ... 

297 

298 There is no runtime checking of these properties. The decorator 

299 sets the ``__final__`` attribute to ``True`` on the decorated object 

300 to allow runtime introspection. 

301 """ 

302 try: 

303 f.__final__ = True 

304 except (AttributeError, TypeError): 

305 # Skip the attribute silently if it is not writable. 

306 # AttributeError happens if the object has __slots__ or a 

307 # read-only property, TypeError if it's a builtin class. 

308 pass 

309 return f 

310 

311 

312def IntVar(name): 

313 return typing.TypeVar(name) 

314 

315 

316# 3.8+: 

317if hasattr(typing, 'Literal'): 

318 Literal = typing.Literal 

319# 3.7: 

320elif sys.version_info[:2] >= (3, 7): 

321 class _LiteralForm(typing._SpecialForm, _root=True): 

322 

323 def __repr__(self): 

324 return 'typing_extensions.' + self._name 

325 

326 def __getitem__(self, parameters): 

327 return typing._GenericAlias(self, parameters) 

328 

329 Literal = _LiteralForm('Literal', 

330 doc="""A type that can be used to indicate to type checkers 

331 that the corresponding value has a value literally equivalent 

332 to the provided parameter. For example: 

333 

334 var: Literal[4] = 4 

335 

336 The type checker understands that 'var' is literally equal to 

337 the value 4 and no other value. 

338 

339 Literal[...] cannot be subclassed. There is no runtime 

340 checking verifying that the parameter is actually a value 

341 instead of a type.""") 

342# 3.6: 

343else: 

344 class _Literal(typing._FinalTypingBase, _root=True): 

345 """A type that can be used to indicate to type checkers that the 

346 corresponding value has a value literally equivalent to the 

347 provided parameter. For example: 

348 

349 var: Literal[4] = 4 

350 

351 The type checker understands that 'var' is literally equal to the 

352 value 4 and no other value. 

353 

354 Literal[...] cannot be subclassed. There is no runtime checking 

355 verifying that the parameter is actually a value instead of a type. 

356 """ 

357 

358 __slots__ = ('__values__',) 

359 

360 def __init__(self, values=None, **kwds): 

361 self.__values__ = values 

362 

363 def __getitem__(self, values): 

364 cls = type(self) 

365 if self.__values__ is None: 

366 if not isinstance(values, tuple): 

367 values = (values,) 

368 return cls(values, _root=True) 

369 raise TypeError(f'{cls.__name__[1:]} cannot be further subscripted') 

370 

371 def _eval_type(self, globalns, localns): 

372 return self 

373 

374 def __repr__(self): 

375 r = super().__repr__() 

376 if self.__values__ is not None: 

377 r += f'[{", ".join(map(typing._type_repr, self.__values__))}]' 

378 return r 

379 

380 def __hash__(self): 

381 return hash((type(self).__name__, self.__values__)) 

382 

383 def __eq__(self, other): 

384 if not isinstance(other, _Literal): 

385 return NotImplemented 

386 if self.__values__ is not None: 

387 return self.__values__ == other.__values__ 

388 return self is other 

389 

390 Literal = _Literal(_root=True) 

391 

392 

393_overload_dummy = typing._overload_dummy # noqa 

394overload = typing.overload 

395 

396 

397# This is not a real generic class. Don't use outside annotations. 

398Type = typing.Type 

399 

400# Various ABCs mimicking those in collections.abc. 

401# A few are simply re-exported for completeness. 

402 

403 

404class _ExtensionsGenericMeta(GenericMeta): 

405 def __subclasscheck__(self, subclass): 

406 """This mimics a more modern GenericMeta.__subclasscheck__() logic 

407 (that does not have problems with recursion) to work around interactions 

408 between collections, typing, and typing_extensions on older 

409 versions of Python, see https://github.com/python/typing/issues/501. 

410 """ 

411 if self.__origin__ is not None: 

412 if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools']: 

413 raise TypeError("Parameterized generics cannot be used with class " 

414 "or instance checks") 

415 return False 

416 if not self.__extra__: 

417 return super().__subclasscheck__(subclass) 

418 res = self.__extra__.__subclasshook__(subclass) 

419 if res is not NotImplemented: 

420 return res 

421 if self.__extra__ in subclass.__mro__: 

422 return True 

423 for scls in self.__extra__.__subclasses__(): 

424 if isinstance(scls, GenericMeta): 

425 continue 

426 if issubclass(subclass, scls): 

427 return True 

428 return False 

429 

430 

431Awaitable = typing.Awaitable 

432Coroutine = typing.Coroutine 

433AsyncIterable = typing.AsyncIterable 

434AsyncIterator = typing.AsyncIterator 

435 

436# 3.6.1+ 

437if hasattr(typing, 'Deque'): 

438 Deque = typing.Deque 

439# 3.6.0 

440else: 

441 class Deque(collections.deque, typing.MutableSequence[T], 

442 metaclass=_ExtensionsGenericMeta, 

443 extra=collections.deque): 

444 __slots__ = () 

445 

446 def __new__(cls, *args, **kwds): 

447 if cls._gorg is Deque: 

448 return collections.deque(*args, **kwds) 

449 return typing._generic_new(collections.deque, cls, *args, **kwds) 

450 

451ContextManager = typing.ContextManager 

452# 3.6.2+ 

453if hasattr(typing, 'AsyncContextManager'): 

454 AsyncContextManager = typing.AsyncContextManager 

455# 3.6.0-3.6.1 

456else: 

457 from _collections_abc import _check_methods as _check_methods_in_mro # noqa 

458 

459 class AsyncContextManager(typing.Generic[T_co]): 

460 __slots__ = () 

461 

462 async def __aenter__(self): 

463 return self 

464 

465 @abc.abstractmethod 

466 async def __aexit__(self, exc_type, exc_value, traceback): 

467 return None 

468 

469 @classmethod 

470 def __subclasshook__(cls, C): 

471 if cls is AsyncContextManager: 

472 return _check_methods_in_mro(C, "__aenter__", "__aexit__") 

473 return NotImplemented 

474 

475DefaultDict = typing.DefaultDict 

476 

477# 3.7.2+ 

478if hasattr(typing, 'OrderedDict'): 

479 OrderedDict = typing.OrderedDict 

480# 3.7.0-3.7.2 

481elif (3, 7, 0) <= sys.version_info[:3] < (3, 7, 2): 

482 OrderedDict = typing._alias(collections.OrderedDict, (KT, VT)) 

483# 3.6 

484else: 

485 class OrderedDict(collections.OrderedDict, typing.MutableMapping[KT, VT], 

486 metaclass=_ExtensionsGenericMeta, 

487 extra=collections.OrderedDict): 

488 

489 __slots__ = () 

490 

491 def __new__(cls, *args, **kwds): 

492 if cls._gorg is OrderedDict: 

493 return collections.OrderedDict(*args, **kwds) 

494 return typing._generic_new(collections.OrderedDict, cls, *args, **kwds) 

495 

496# 3.6.2+ 

497if hasattr(typing, 'Counter'): 

498 Counter = typing.Counter 

499# 3.6.0-3.6.1 

500else: 

501 class Counter(collections.Counter, 

502 typing.Dict[T, int], 

503 metaclass=_ExtensionsGenericMeta, extra=collections.Counter): 

504 

505 __slots__ = () 

506 

507 def __new__(cls, *args, **kwds): 

508 if cls._gorg is Counter: 

509 return collections.Counter(*args, **kwds) 

510 return typing._generic_new(collections.Counter, cls, *args, **kwds) 

511 

512# 3.6.1+ 

513if hasattr(typing, 'ChainMap'): 

514 ChainMap = typing.ChainMap 

515elif hasattr(collections, 'ChainMap'): 

516 class ChainMap(collections.ChainMap, typing.MutableMapping[KT, VT], 

517 metaclass=_ExtensionsGenericMeta, 

518 extra=collections.ChainMap): 

519 

520 __slots__ = () 

521 

522 def __new__(cls, *args, **kwds): 

523 if cls._gorg is ChainMap: 

524 return collections.ChainMap(*args, **kwds) 

525 return typing._generic_new(collections.ChainMap, cls, *args, **kwds) 

526 

527# 3.6.1+ 

528if hasattr(typing, 'AsyncGenerator'): 

529 AsyncGenerator = typing.AsyncGenerator 

530# 3.6.0 

531else: 

532 class AsyncGenerator(AsyncIterator[T_co], typing.Generic[T_co, T_contra], 

533 metaclass=_ExtensionsGenericMeta, 

534 extra=collections.abc.AsyncGenerator): 

535 __slots__ = () 

536 

537NewType = typing.NewType 

538Text = typing.Text 

539TYPE_CHECKING = typing.TYPE_CHECKING 

540 

541 

542def _gorg(cls): 

543 """This function exists for compatibility with old typing versions.""" 

544 assert isinstance(cls, GenericMeta) 

545 if hasattr(cls, '_gorg'): 

546 return cls._gorg 

547 while cls.__origin__ is not None: 

548 cls = cls.__origin__ 

549 return cls 

550 

551 

552_PROTO_WHITELIST = ['Callable', 'Awaitable', 

553 'Iterable', 'Iterator', 'AsyncIterable', 'AsyncIterator', 

554 'Hashable', 'Sized', 'Container', 'Collection', 'Reversible', 

555 'ContextManager', 'AsyncContextManager'] 

556 

557 

558def _get_protocol_attrs(cls): 

559 attrs = set() 

560 for base in cls.__mro__[:-1]: # without object 

561 if base.__name__ in ('Protocol', 'Generic'): 

562 continue 

563 annotations = getattr(base, '__annotations__', {}) 

564 for attr in list(base.__dict__.keys()) + list(annotations.keys()): 

565 if (not attr.startswith('_abc_') and attr not in ( 

566 '__abstractmethods__', '__annotations__', '__weakref__', 

567 '_is_protocol', '_is_runtime_protocol', '__dict__', 

568 '__args__', '__slots__', 

569 '__next_in_mro__', '__parameters__', '__origin__', 

570 '__orig_bases__', '__extra__', '__tree_hash__', 

571 '__doc__', '__subclasshook__', '__init__', '__new__', 

572 '__module__', '_MutableMapping__marker', '_gorg')): 

573 attrs.add(attr) 

574 return attrs 

575 

576 

577def _is_callable_members_only(cls): 

578 return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls)) 

579 

580 

581# 3.8+ 

582if hasattr(typing, 'Protocol'): 

583 Protocol = typing.Protocol 

584# 3.7 

585elif PEP_560: 

586 

587 def _no_init(self, *args, **kwargs): 

588 if type(self)._is_protocol: 

589 raise TypeError('Protocols cannot be instantiated') 

590 

591 class _ProtocolMeta(abc.ABCMeta): 

592 # This metaclass is a bit unfortunate and exists only because of the lack 

593 # of __instancehook__. 

594 def __instancecheck__(cls, instance): 

595 # We need this method for situations where attributes are 

596 # assigned in __init__. 

597 if ((not getattr(cls, '_is_protocol', False) or 

598 _is_callable_members_only(cls)) and 

599 issubclass(instance.__class__, cls)): 

600 return True 

601 if cls._is_protocol: 

602 if all(hasattr(instance, attr) and 

603 (not callable(getattr(cls, attr, None)) or 

604 getattr(instance, attr) is not None) 

605 for attr in _get_protocol_attrs(cls)): 

606 return True 

607 return super().__instancecheck__(instance) 

608 

609 class Protocol(metaclass=_ProtocolMeta): 

610 # There is quite a lot of overlapping code with typing.Generic. 

611 # Unfortunately it is hard to avoid this while these live in two different 

612 # modules. The duplicated code will be removed when Protocol is moved to typing. 

613 """Base class for protocol classes. Protocol classes are defined as:: 

614 

615 class Proto(Protocol): 

616 def meth(self) -> int: 

617 ... 

618 

619 Such classes are primarily used with static type checkers that recognize 

620 structural subtyping (static duck-typing), for example:: 

621 

622 class C: 

623 def meth(self) -> int: 

624 return 0 

625 

626 def func(x: Proto) -> int: 

627 return x.meth() 

628 

629 func(C()) # Passes static type check 

630 

631 See PEP 544 for details. Protocol classes decorated with 

632 @typing_extensions.runtime act as simple-minded runtime protocol that checks 

633 only the presence of given attributes, ignoring their type signatures. 

634 

635 Protocol classes can be generic, they are defined as:: 

636 

637 class GenProto(Protocol[T]): 

638 def meth(self) -> T: 

639 ... 

640 """ 

641 __slots__ = () 

642 _is_protocol = True 

643 

644 def __new__(cls, *args, **kwds): 

645 if cls is Protocol: 

646 raise TypeError("Type Protocol cannot be instantiated; " 

647 "it can only be used as a base class") 

648 return super().__new__(cls) 

649 

650 @typing._tp_cache 

651 def __class_getitem__(cls, params): 

652 if not isinstance(params, tuple): 

653 params = (params,) 

654 if not params and cls is not typing.Tuple: 

655 raise TypeError( 

656 f"Parameter list to {cls.__qualname__}[...] cannot be empty") 

657 msg = "Parameters to generic types must be types." 

658 params = tuple(typing._type_check(p, msg) for p in params) # noqa 

659 if cls is Protocol: 

660 # Generic can only be subscripted with unique type variables. 

661 if not all(isinstance(p, typing.TypeVar) for p in params): 

662 i = 0 

663 while isinstance(params[i], typing.TypeVar): 

664 i += 1 

665 raise TypeError( 

666 "Parameters to Protocol[...] must all be type variables." 

667 f" Parameter {i + 1} is {params[i]}") 

668 if len(set(params)) != len(params): 

669 raise TypeError( 

670 "Parameters to Protocol[...] must all be unique") 

671 else: 

672 # Subscripting a regular Generic subclass. 

673 _check_generic(cls, params, len(cls.__parameters__)) 

674 return typing._GenericAlias(cls, params) 

675 

676 def __init_subclass__(cls, *args, **kwargs): 

677 tvars = [] 

678 if '__orig_bases__' in cls.__dict__: 

679 error = typing.Generic in cls.__orig_bases__ 

680 else: 

681 error = typing.Generic in cls.__bases__ 

682 if error: 

683 raise TypeError("Cannot inherit from plain Generic") 

684 if '__orig_bases__' in cls.__dict__: 

685 tvars = typing._collect_type_vars(cls.__orig_bases__) 

686 # Look for Generic[T1, ..., Tn] or Protocol[T1, ..., Tn]. 

687 # If found, tvars must be a subset of it. 

688 # If not found, tvars is it. 

689 # Also check for and reject plain Generic, 

690 # and reject multiple Generic[...] and/or Protocol[...]. 

691 gvars = None 

692 for base in cls.__orig_bases__: 

693 if (isinstance(base, typing._GenericAlias) and 

694 base.__origin__ in (typing.Generic, Protocol)): 

695 # for error messages 

696 the_base = base.__origin__.__name__ 

697 if gvars is not None: 

698 raise TypeError( 

699 "Cannot inherit from Generic[...]" 

700 " and/or Protocol[...] multiple types.") 

701 gvars = base.__parameters__ 

702 if gvars is None: 

703 gvars = tvars 

704 else: 

705 tvarset = set(tvars) 

706 gvarset = set(gvars) 

707 if not tvarset <= gvarset: 

708 s_vars = ', '.join(str(t) for t in tvars if t not in gvarset) 

709 s_args = ', '.join(str(g) for g in gvars) 

710 raise TypeError(f"Some type variables ({s_vars}) are" 

711 f" not listed in {the_base}[{s_args}]") 

712 tvars = gvars 

713 cls.__parameters__ = tuple(tvars) 

714 

715 # Determine if this is a protocol or a concrete subclass. 

716 if not cls.__dict__.get('_is_protocol', None): 

717 cls._is_protocol = any(b is Protocol for b in cls.__bases__) 

718 

719 # Set (or override) the protocol subclass hook. 

720 def _proto_hook(other): 

721 if not cls.__dict__.get('_is_protocol', None): 

722 return NotImplemented 

723 if not getattr(cls, '_is_runtime_protocol', False): 

724 if sys._getframe(2).f_globals['__name__'] in ['abc', 'functools']: 

725 return NotImplemented 

726 raise TypeError("Instance and class checks can only be used with" 

727 " @runtime protocols") 

728 if not _is_callable_members_only(cls): 

729 if sys._getframe(2).f_globals['__name__'] in ['abc', 'functools']: 

730 return NotImplemented 

731 raise TypeError("Protocols with non-method members" 

732 " don't support issubclass()") 

733 if not isinstance(other, type): 

734 # Same error as for issubclass(1, int) 

735 raise TypeError('issubclass() arg 1 must be a class') 

736 for attr in _get_protocol_attrs(cls): 

737 for base in other.__mro__: 

738 if attr in base.__dict__: 

739 if base.__dict__[attr] is None: 

740 return NotImplemented 

741 break 

742 annotations = getattr(base, '__annotations__', {}) 

743 if (isinstance(annotations, typing.Mapping) and 

744 attr in annotations and 

745 isinstance(other, _ProtocolMeta) and 

746 other._is_protocol): 

747 break 

748 else: 

749 return NotImplemented 

750 return True 

751 if '__subclasshook__' not in cls.__dict__: 

752 cls.__subclasshook__ = _proto_hook 

753 

754 # We have nothing more to do for non-protocols. 

755 if not cls._is_protocol: 

756 return 

757 

758 # Check consistency of bases. 

759 for base in cls.__bases__: 

760 if not (base in (object, typing.Generic) or 

761 base.__module__ == 'collections.abc' and 

762 base.__name__ in _PROTO_WHITELIST or 

763 isinstance(base, _ProtocolMeta) and base._is_protocol): 

764 raise TypeError('Protocols can only inherit from other' 

765 f' protocols, got {repr(base)}') 

766 cls.__init__ = _no_init 

767# 3.6 

768else: 

769 from typing import _next_in_mro, _type_check # noqa 

770 

771 def _no_init(self, *args, **kwargs): 

772 if type(self)._is_protocol: 

773 raise TypeError('Protocols cannot be instantiated') 

774 

775 class _ProtocolMeta(GenericMeta): 

776 """Internal metaclass for Protocol. 

777 

778 This exists so Protocol classes can be generic without deriving 

779 from Generic. 

780 """ 

781 def __new__(cls, name, bases, namespace, 

782 tvars=None, args=None, origin=None, extra=None, orig_bases=None): 

783 # This is just a version copied from GenericMeta.__new__ that 

784 # includes "Protocol" special treatment. (Comments removed for brevity.) 

785 assert extra is None # Protocols should not have extra 

786 if tvars is not None: 

787 assert origin is not None 

788 assert all(isinstance(t, typing.TypeVar) for t in tvars), tvars 

789 else: 

790 tvars = _type_vars(bases) 

791 gvars = None 

792 for base in bases: 

793 if base is typing.Generic: 

794 raise TypeError("Cannot inherit from plain Generic") 

795 if (isinstance(base, GenericMeta) and 

796 base.__origin__ in (typing.Generic, Protocol)): 

797 if gvars is not None: 

798 raise TypeError( 

799 "Cannot inherit from Generic[...] or" 

800 " Protocol[...] multiple times.") 

801 gvars = base.__parameters__ 

802 if gvars is None: 

803 gvars = tvars 

804 else: 

805 tvarset = set(tvars) 

806 gvarset = set(gvars) 

807 if not tvarset <= gvarset: 

808 s_vars = ", ".join(str(t) for t in tvars if t not in gvarset) 

809 s_args = ", ".join(str(g) for g in gvars) 

810 cls_name = "Generic" if any(b.__origin__ is typing.Generic 

811 for b in bases) else "Protocol" 

812 raise TypeError(f"Some type variables ({s_vars}) are" 

813 f" not listed in {cls_name}[{s_args}]") 

814 tvars = gvars 

815 

816 initial_bases = bases 

817 if (extra is not None and type(extra) is abc.ABCMeta and 

818 extra not in bases): 

819 bases = (extra,) + bases 

820 bases = tuple(_gorg(b) if isinstance(b, GenericMeta) else b 

821 for b in bases) 

822 if any(isinstance(b, GenericMeta) and b is not typing.Generic for b in bases): 

823 bases = tuple(b for b in bases if b is not typing.Generic) 

824 namespace.update({'__origin__': origin, '__extra__': extra}) 

825 self = super(GenericMeta, cls).__new__(cls, name, bases, namespace, 

826 _root=True) 

827 super(GenericMeta, self).__setattr__('_gorg', 

828 self if not origin else 

829 _gorg(origin)) 

830 self.__parameters__ = tvars 

831 self.__args__ = tuple(... if a is typing._TypingEllipsis else 

832 () if a is typing._TypingEmpty else 

833 a for a in args) if args else None 

834 self.__next_in_mro__ = _next_in_mro(self) 

835 if orig_bases is None: 

836 self.__orig_bases__ = initial_bases 

837 elif origin is not None: 

838 self._abc_registry = origin._abc_registry 

839 self._abc_cache = origin._abc_cache 

840 if hasattr(self, '_subs_tree'): 

841 self.__tree_hash__ = (hash(self._subs_tree()) if origin else 

842 super(GenericMeta, self).__hash__()) 

843 return self 

844 

845 def __init__(cls, *args, **kwargs): 

846 super().__init__(*args, **kwargs) 

847 if not cls.__dict__.get('_is_protocol', None): 

848 cls._is_protocol = any(b is Protocol or 

849 isinstance(b, _ProtocolMeta) and 

850 b.__origin__ is Protocol 

851 for b in cls.__bases__) 

852 if cls._is_protocol: 

853 for base in cls.__mro__[1:]: 

854 if not (base in (object, typing.Generic) or 

855 base.__module__ == 'collections.abc' and 

856 base.__name__ in _PROTO_WHITELIST or 

857 isinstance(base, typing.TypingMeta) and base._is_protocol or 

858 isinstance(base, GenericMeta) and 

859 base.__origin__ is typing.Generic): 

860 raise TypeError(f'Protocols can only inherit from other' 

861 f' protocols, got {repr(base)}') 

862 

863 cls.__init__ = _no_init 

864 

865 def _proto_hook(other): 

866 if not cls.__dict__.get('_is_protocol', None): 

867 return NotImplemented 

868 if not isinstance(other, type): 

869 # Same error as for issubclass(1, int) 

870 raise TypeError('issubclass() arg 1 must be a class') 

871 for attr in _get_protocol_attrs(cls): 

872 for base in other.__mro__: 

873 if attr in base.__dict__: 

874 if base.__dict__[attr] is None: 

875 return NotImplemented 

876 break 

877 annotations = getattr(base, '__annotations__', {}) 

878 if (isinstance(annotations, typing.Mapping) and 

879 attr in annotations and 

880 isinstance(other, _ProtocolMeta) and 

881 other._is_protocol): 

882 break 

883 else: 

884 return NotImplemented 

885 return True 

886 if '__subclasshook__' not in cls.__dict__: 

887 cls.__subclasshook__ = _proto_hook 

888 

889 def __instancecheck__(self, instance): 

890 # We need this method for situations where attributes are 

891 # assigned in __init__. 

892 if ((not getattr(self, '_is_protocol', False) or 

893 _is_callable_members_only(self)) and 

894 issubclass(instance.__class__, self)): 

895 return True 

896 if self._is_protocol: 

897 if all(hasattr(instance, attr) and 

898 (not callable(getattr(self, attr, None)) or 

899 getattr(instance, attr) is not None) 

900 for attr in _get_protocol_attrs(self)): 

901 return True 

902 return super(GenericMeta, self).__instancecheck__(instance) 

903 

904 def __subclasscheck__(self, cls): 

905 if self.__origin__ is not None: 

906 if sys._getframe(1).f_globals['__name__'] not in ['abc', 'functools']: 

907 raise TypeError("Parameterized generics cannot be used with class " 

908 "or instance checks") 

909 return False 

910 if (self.__dict__.get('_is_protocol', None) and 

911 not self.__dict__.get('_is_runtime_protocol', None)): 

912 if sys._getframe(1).f_globals['__name__'] in ['abc', 

913 'functools', 

914 'typing']: 

915 return False 

916 raise TypeError("Instance and class checks can only be used with" 

917 " @runtime protocols") 

918 if (self.__dict__.get('_is_runtime_protocol', None) and 

919 not _is_callable_members_only(self)): 

920 if sys._getframe(1).f_globals['__name__'] in ['abc', 

921 'functools', 

922 'typing']: 

923 return super(GenericMeta, self).__subclasscheck__(cls) 

924 raise TypeError("Protocols with non-method members" 

925 " don't support issubclass()") 

926 return super(GenericMeta, self).__subclasscheck__(cls) 

927 

928 @typing._tp_cache 

929 def __getitem__(self, params): 

930 # We also need to copy this from GenericMeta.__getitem__ to get 

931 # special treatment of "Protocol". (Comments removed for brevity.) 

932 if not isinstance(params, tuple): 

933 params = (params,) 

934 if not params and _gorg(self) is not typing.Tuple: 

935 raise TypeError( 

936 f"Parameter list to {self.__qualname__}[...] cannot be empty") 

937 msg = "Parameters to generic types must be types." 

938 params = tuple(_type_check(p, msg) for p in params) 

939 if self in (typing.Generic, Protocol): 

940 if not all(isinstance(p, typing.TypeVar) for p in params): 

941 raise TypeError( 

942 f"Parameters to {repr(self)}[...] must all be type variables") 

943 if len(set(params)) != len(params): 

944 raise TypeError( 

945 f"Parameters to {repr(self)}[...] must all be unique") 

946 tvars = params 

947 args = params 

948 elif self in (typing.Tuple, typing.Callable): 

949 tvars = _type_vars(params) 

950 args = params 

951 elif self.__origin__ in (typing.Generic, Protocol): 

952 raise TypeError(f"Cannot subscript already-subscripted {repr(self)}") 

953 else: 

954 _check_generic(self, params, len(self.__parameters__)) 

955 tvars = _type_vars(params) 

956 args = params 

957 

958 prepend = (self,) if self.__origin__ is None else () 

959 return self.__class__(self.__name__, 

960 prepend + self.__bases__, 

961 _no_slots_copy(self.__dict__), 

962 tvars=tvars, 

963 args=args, 

964 origin=self, 

965 extra=self.__extra__, 

966 orig_bases=self.__orig_bases__) 

967 

968 class Protocol(metaclass=_ProtocolMeta): 

969 """Base class for protocol classes. Protocol classes are defined as:: 

970 

971 class Proto(Protocol): 

972 def meth(self) -> int: 

973 ... 

974 

975 Such classes are primarily used with static type checkers that recognize 

976 structural subtyping (static duck-typing), for example:: 

977 

978 class C: 

979 def meth(self) -> int: 

980 return 0 

981 

982 def func(x: Proto) -> int: 

983 return x.meth() 

984 

985 func(C()) # Passes static type check 

986 

987 See PEP 544 for details. Protocol classes decorated with 

988 @typing_extensions.runtime act as simple-minded runtime protocol that checks 

989 only the presence of given attributes, ignoring their type signatures. 

990 

991 Protocol classes can be generic, they are defined as:: 

992 

993 class GenProto(Protocol[T]): 

994 def meth(self) -> T: 

995 ... 

996 """ 

997 __slots__ = () 

998 _is_protocol = True 

999 

1000 def __new__(cls, *args, **kwds): 

1001 if _gorg(cls) is Protocol: 

1002 raise TypeError("Type Protocol cannot be instantiated; " 

1003 "it can be used only as a base class") 

1004 return typing._generic_new(cls.__next_in_mro__, cls, *args, **kwds) 

1005 

1006 

1007# 3.8+ 

1008if hasattr(typing, 'runtime_checkable'): 

1009 runtime_checkable = typing.runtime_checkable 

1010# 3.6-3.7 

1011else: 

1012 def runtime_checkable(cls): 

1013 """Mark a protocol class as a runtime protocol, so that it 

1014 can be used with isinstance() and issubclass(). Raise TypeError 

1015 if applied to a non-protocol class. 

1016 

1017 This allows a simple-minded structural check very similar to the 

1018 one-offs in collections.abc such as Hashable. 

1019 """ 

1020 if not isinstance(cls, _ProtocolMeta) or not cls._is_protocol: 

1021 raise TypeError('@runtime_checkable can be only applied to protocol classes,' 

1022 f' got {cls!r}') 

1023 cls._is_runtime_protocol = True 

1024 return cls 

1025 

1026 

1027# Exists for backwards compatibility. 

1028runtime = runtime_checkable 

1029 

1030 

1031# 3.8+ 

1032if hasattr(typing, 'SupportsIndex'): 

1033 SupportsIndex = typing.SupportsIndex 

1034# 3.6-3.7 

1035else: 

1036 @runtime_checkable 

1037 class SupportsIndex(Protocol): 

1038 __slots__ = () 

1039 

1040 @abc.abstractmethod 

1041 def __index__(self) -> int: 

1042 pass 

1043 

1044 

1045if hasattr(typing, "Required"): 

1046 # The standard library TypedDict in Python 3.8 does not store runtime information 

1047 # about which (if any) keys are optional. See https://bugs.python.org/issue38834 

1048 # The standard library TypedDict in Python 3.9.0/1 does not honour the "total" 

1049 # keyword with old-style TypedDict(). See https://bugs.python.org/issue42059 

1050 # The standard library TypedDict below Python 3.11 does not store runtime 

1051 # information about optional and required keys when using Required or NotRequired. 

1052 TypedDict = typing.TypedDict 

1053 _TypedDictMeta = typing._TypedDictMeta 

1054 is_typeddict = typing.is_typeddict 

1055else: 

1056 def _check_fails(cls, other): 

1057 try: 

1058 if sys._getframe(1).f_globals['__name__'] not in ['abc', 

1059 'functools', 

1060 'typing']: 

1061 # Typed dicts are only for static structural subtyping. 

1062 raise TypeError('TypedDict does not support instance and class checks') 

1063 except (AttributeError, ValueError): 

1064 pass 

1065 return False 

1066 

1067 def _dict_new(*args, **kwargs): 

1068 if not args: 

1069 raise TypeError('TypedDict.__new__(): not enough arguments') 

1070 _, args = args[0], args[1:] # allow the "cls" keyword be passed 

1071 return dict(*args, **kwargs) 

1072 

1073 _dict_new.__text_signature__ = '($cls, _typename, _fields=None, /, **kwargs)' 

1074 

1075 def _typeddict_new(*args, total=True, **kwargs): 

1076 if not args: 

1077 raise TypeError('TypedDict.__new__(): not enough arguments') 

1078 _, args = args[0], args[1:] # allow the "cls" keyword be passed 

1079 if args: 

1080 typename, args = args[0], args[1:] # allow the "_typename" keyword be passed 

1081 elif '_typename' in kwargs: 

1082 typename = kwargs.pop('_typename') 

1083 import warnings 

1084 warnings.warn("Passing '_typename' as keyword argument is deprecated", 

1085 DeprecationWarning, stacklevel=2) 

1086 else: 

1087 raise TypeError("TypedDict.__new__() missing 1 required positional " 

1088 "argument: '_typename'") 

1089 if args: 

1090 try: 

1091 fields, = args # allow the "_fields" keyword be passed 

1092 except ValueError: 

1093 raise TypeError('TypedDict.__new__() takes from 2 to 3 ' 

1094 f'positional arguments but {len(args) + 2} ' 

1095 'were given') 

1096 elif '_fields' in kwargs and len(kwargs) == 1: 

1097 fields = kwargs.pop('_fields') 

1098 import warnings 

1099 warnings.warn("Passing '_fields' as keyword argument is deprecated", 

1100 DeprecationWarning, stacklevel=2) 

1101 else: 

1102 fields = None 

1103 

1104 if fields is None: 

1105 fields = kwargs 

1106 elif kwargs: 

1107 raise TypeError("TypedDict takes either a dict or keyword arguments," 

1108 " but not both") 

1109 

1110 ns = {'__annotations__': dict(fields)} 

1111 try: 

1112 # Setting correct module is necessary to make typed dict classes pickleable. 

1113 ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__') 

1114 except (AttributeError, ValueError): 

1115 pass 

1116 

1117 return _TypedDictMeta(typename, (), ns, total=total) 

1118 

1119 _typeddict_new.__text_signature__ = ('($cls, _typename, _fields=None,' 

1120 ' /, *, total=True, **kwargs)') 

1121 

1122 class _TypedDictMeta(type): 

1123 def __init__(cls, name, bases, ns, total=True): 

1124 super().__init__(name, bases, ns) 

1125 

1126 def __new__(cls, name, bases, ns, total=True): 

1127 # Create new typed dict class object. 

1128 # This method is called directly when TypedDict is subclassed, 

1129 # or via _typeddict_new when TypedDict is instantiated. This way 

1130 # TypedDict supports all three syntaxes described in its docstring. 

1131 # Subclasses and instances of TypedDict return actual dictionaries 

1132 # via _dict_new. 

1133 ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new 

1134 tp_dict = super().__new__(cls, name, (dict,), ns) 

1135 

1136 annotations = {} 

1137 own_annotations = ns.get('__annotations__', {}) 

1138 msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" 

1139 own_annotations = { 

1140 n: typing._type_check(tp, msg) for n, tp in own_annotations.items() 

1141 } 

1142 required_keys = set() 

1143 optional_keys = set() 

1144 

1145 for base in bases: 

1146 annotations.update(base.__dict__.get('__annotations__', {})) 

1147 required_keys.update(base.__dict__.get('__required_keys__', ())) 

1148 optional_keys.update(base.__dict__.get('__optional_keys__', ())) 

1149 

1150 annotations.update(own_annotations) 

1151 if PEP_560: 

1152 for annotation_key, annotation_type in own_annotations.items(): 

1153 annotation_origin = get_origin(annotation_type) 

1154 if annotation_origin is Annotated: 

1155 annotation_args = get_args(annotation_type) 

1156 if annotation_args: 

1157 annotation_type = annotation_args[0] 

1158 annotation_origin = get_origin(annotation_type) 

1159 

1160 if annotation_origin is Required: 

1161 required_keys.add(annotation_key) 

1162 elif annotation_origin is NotRequired: 

1163 optional_keys.add(annotation_key) 

1164 elif total: 

1165 required_keys.add(annotation_key) 

1166 else: 

1167 optional_keys.add(annotation_key) 

1168 else: 

1169 own_annotation_keys = set(own_annotations.keys()) 

1170 if total: 

1171 required_keys.update(own_annotation_keys) 

1172 else: 

1173 optional_keys.update(own_annotation_keys) 

1174 

1175 tp_dict.__annotations__ = annotations 

1176 tp_dict.__required_keys__ = frozenset(required_keys) 

1177 tp_dict.__optional_keys__ = frozenset(optional_keys) 

1178 if not hasattr(tp_dict, '__total__'): 

1179 tp_dict.__total__ = total 

1180 return tp_dict 

1181 

1182 __instancecheck__ = __subclasscheck__ = _check_fails 

1183 

1184 TypedDict = _TypedDictMeta('TypedDict', (dict,), {}) 

1185 TypedDict.__module__ = __name__ 

1186 TypedDict.__doc__ = \ 

1187 """A simple typed name space. At runtime it is equivalent to a plain dict. 

1188 

1189 TypedDict creates a dictionary type that expects all of its 

1190 instances to have a certain set of keys, with each key 

1191 associated with a value of a consistent type. This expectation 

1192 is not checked at runtime but is only enforced by type checkers. 

1193 Usage:: 

1194 

1195 class Point2D(TypedDict): 

1196 x: int 

1197 y: int 

1198 label: str 

1199 

1200 a: Point2D = {'x': 1, 'y': 2, 'label': 'good'} # OK 

1201 b: Point2D = {'z': 3, 'label': 'bad'} # Fails type check 

1202 

1203 assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') 

1204 

1205 The type info can be accessed via the Point2D.__annotations__ dict, and 

1206 the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. 

1207 TypedDict supports two additional equivalent forms:: 

1208 

1209 Point2D = TypedDict('Point2D', x=int, y=int, label=str) 

1210 Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) 

1211 

1212 The class syntax is only supported in Python 3.6+, while two other 

1213 syntax forms work for Python 2.7 and 3.2+ 

1214 """ 

1215 

1216 if hasattr(typing, "_TypedDictMeta"): 

1217 _TYPEDDICT_TYPES = (typing._TypedDictMeta, _TypedDictMeta) 

1218 else: 

1219 _TYPEDDICT_TYPES = (_TypedDictMeta,) 

1220 

1221 def is_typeddict(tp): 

1222 """Check if an annotation is a TypedDict class 

1223 

1224 For example:: 

1225 class Film(TypedDict): 

1226 title: str 

1227 year: int 

1228 

1229 is_typeddict(Film) # => True 

1230 is_typeddict(Union[list, str]) # => False 

1231 """ 

1232 return isinstance(tp, tuple(_TYPEDDICT_TYPES)) 

1233 

1234if hasattr(typing, "Required"): 

1235 get_type_hints = typing.get_type_hints 

1236elif PEP_560: 

1237 import functools 

1238 import types 

1239 

1240 # replaces _strip_annotations() 

1241 def _strip_extras(t): 

1242 """Strips Annotated, Required and NotRequired from a given type.""" 

1243 if isinstance(t, _AnnotatedAlias): 

1244 return _strip_extras(t.__origin__) 

1245 if hasattr(t, "__origin__") and t.__origin__ in (Required, NotRequired): 

1246 return _strip_extras(t.__args__[0]) 

1247 if isinstance(t, typing._GenericAlias): 

1248 stripped_args = tuple(_strip_extras(a) for a in t.__args__) 

1249 if stripped_args == t.__args__: 

1250 return t 

1251 return t.copy_with(stripped_args) 

1252 if hasattr(types, "GenericAlias") and isinstance(t, types.GenericAlias): 

1253 stripped_args = tuple(_strip_extras(a) for a in t.__args__) 

1254 if stripped_args == t.__args__: 

1255 return t 

1256 return types.GenericAlias(t.__origin__, stripped_args) 

1257 if hasattr(types, "UnionType") and isinstance(t, types.UnionType): 

1258 stripped_args = tuple(_strip_extras(a) for a in t.__args__) 

1259 if stripped_args == t.__args__: 

1260 return t 

1261 return functools.reduce(operator.or_, stripped_args) 

1262 

1263 return t 

1264 

1265 def get_type_hints(obj, globalns=None, localns=None, include_extras=False): 

1266 """Return type hints for an object. 

1267 

1268 This is often the same as obj.__annotations__, but it handles 

1269 forward references encoded as string literals, adds Optional[t] if a 

1270 default value equal to None is set and recursively replaces all 

1271 'Annotated[T, ...]', 'Required[T]' or 'NotRequired[T]' with 'T' 

1272 (unless 'include_extras=True'). 

1273 

1274 The argument may be a module, class, method, or function. The annotations 

1275 are returned as a dictionary. For classes, annotations include also 

1276 inherited members. 

1277 

1278 TypeError is raised if the argument is not of a type that can contain 

1279 annotations, and an empty dictionary is returned if no annotations are 

1280 present. 

1281 

1282 BEWARE -- the behavior of globalns and localns is counterintuitive 

1283 (unless you are familiar with how eval() and exec() work). The 

1284 search order is locals first, then globals. 

1285 

1286 - If no dict arguments are passed, an attempt is made to use the 

1287 globals from obj (or the respective module's globals for classes), 

1288 and these are also used as the locals. If the object does not appear 

1289 to have globals, an empty dictionary is used. 

1290 

1291 - If one dict argument is passed, it is used for both globals and 

1292 locals. 

1293 

1294 - If two dict arguments are passed, they specify globals and 

1295 locals, respectively. 

1296 """ 

1297 if hasattr(typing, "Annotated"): 

1298 hint = typing.get_type_hints( 

1299 obj, globalns=globalns, localns=localns, include_extras=True 

1300 ) 

1301 else: 

1302 hint = typing.get_type_hints(obj, globalns=globalns, localns=localns) 

1303 if include_extras: 

1304 return hint 

1305 return {k: _strip_extras(t) for k, t in hint.items()} 

1306 

1307 

1308# Python 3.9+ has PEP 593 (Annotated) 

1309if hasattr(typing, 'Annotated'): 

1310 Annotated = typing.Annotated 

1311 # Not exported and not a public API, but needed for get_origin() and get_args() 

1312 # to work. 

1313 _AnnotatedAlias = typing._AnnotatedAlias 

1314# 3.7-3.8 

1315elif PEP_560: 

1316 class _AnnotatedAlias(typing._GenericAlias, _root=True): 

1317 """Runtime representation of an annotated type. 

1318 

1319 At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't' 

1320 with extra annotations. The alias behaves like a normal typing alias, 

1321 instantiating is the same as instantiating the underlying type, binding 

1322 it to types is also the same. 

1323 """ 

1324 def __init__(self, origin, metadata): 

1325 if isinstance(origin, _AnnotatedAlias): 

1326 metadata = origin.__metadata__ + metadata 

1327 origin = origin.__origin__ 

1328 super().__init__(origin, origin) 

1329 self.__metadata__ = metadata 

1330 

1331 def copy_with(self, params): 

1332 assert len(params) == 1 

1333 new_type = params[0] 

1334 return _AnnotatedAlias(new_type, self.__metadata__) 

1335 

1336 def __repr__(self): 

1337 return (f"typing_extensions.Annotated[{typing._type_repr(self.__origin__)}, " 

1338 f"{', '.join(repr(a) for a in self.__metadata__)}]") 

1339 

1340 def __reduce__(self): 

1341 return operator.getitem, ( 

1342 Annotated, (self.__origin__,) + self.__metadata__ 

1343 ) 

1344 

1345 def __eq__(self, other): 

1346 if not isinstance(other, _AnnotatedAlias): 

1347 return NotImplemented 

1348 if self.__origin__ != other.__origin__: 

1349 return False 

1350 return self.__metadata__ == other.__metadata__ 

1351 

1352 def __hash__(self): 

1353 return hash((self.__origin__, self.__metadata__)) 

1354 

1355 class Annotated: 

1356 """Add context specific metadata to a type. 

1357 

1358 Example: Annotated[int, runtime_check.Unsigned] indicates to the 

1359 hypothetical runtime_check module that this type is an unsigned int. 

1360 Every other consumer of this type can ignore this metadata and treat 

1361 this type as int. 

1362 

1363 The first argument to Annotated must be a valid type (and will be in 

1364 the __origin__ field), the remaining arguments are kept as a tuple in 

1365 the __extra__ field. 

1366 

1367 Details: 

1368 

1369 - It's an error to call `Annotated` with less than two arguments. 

1370 - Nested Annotated are flattened:: 

1371 

1372 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] 

1373 

1374 - Instantiating an annotated type is equivalent to instantiating the 

1375 underlying type:: 

1376 

1377 Annotated[C, Ann1](5) == C(5) 

1378 

1379 - Annotated can be used as a generic type alias:: 

1380 

1381 Optimized = Annotated[T, runtime.Optimize()] 

1382 Optimized[int] == Annotated[int, runtime.Optimize()] 

1383 

1384 OptimizedList = Annotated[List[T], runtime.Optimize()] 

1385 OptimizedList[int] == Annotated[List[int], runtime.Optimize()] 

1386 """ 

1387 

1388 __slots__ = () 

1389 

1390 def __new__(cls, *args, **kwargs): 

1391 raise TypeError("Type Annotated cannot be instantiated.") 

1392 

1393 @typing._tp_cache 

1394 def __class_getitem__(cls, params): 

1395 if not isinstance(params, tuple) or len(params) < 2: 

1396 raise TypeError("Annotated[...] should be used " 

1397 "with at least two arguments (a type and an " 

1398 "annotation).") 

1399 allowed_special_forms = (ClassVar, Final) 

1400 if get_origin(params[0]) in allowed_special_forms: 

1401 origin = params[0] 

1402 else: 

1403 msg = "Annotated[t, ...]: t must be a type." 

1404 origin = typing._type_check(params[0], msg) 

1405 metadata = tuple(params[1:]) 

1406 return _AnnotatedAlias(origin, metadata) 

1407 

1408 def __init_subclass__(cls, *args, **kwargs): 

1409 raise TypeError( 

1410 f"Cannot subclass {cls.__module__}.Annotated" 

1411 ) 

1412# 3.6 

1413else: 

1414 

1415 def _is_dunder(name): 

1416 """Returns True if name is a __dunder_variable_name__.""" 

1417 return len(name) > 4 and name.startswith('__') and name.endswith('__') 

1418 

1419 # Prior to Python 3.7 types did not have `copy_with`. A lot of the equality 

1420 # checks, argument expansion etc. are done on the _subs_tre. As a result we 

1421 # can't provide a get_type_hints function that strips out annotations. 

1422 

1423 class AnnotatedMeta(typing.GenericMeta): 

1424 """Metaclass for Annotated""" 

1425 

1426 def __new__(cls, name, bases, namespace, **kwargs): 

1427 if any(b is not object for b in bases): 

1428 raise TypeError("Cannot subclass " + str(Annotated)) 

1429 return super().__new__(cls, name, bases, namespace, **kwargs) 

1430 

1431 @property 

1432 def __metadata__(self): 

1433 return self._subs_tree()[2] 

1434 

1435 def _tree_repr(self, tree): 

1436 cls, origin, metadata = tree 

1437 if not isinstance(origin, tuple): 

1438 tp_repr = typing._type_repr(origin) 

1439 else: 

1440 tp_repr = origin[0]._tree_repr(origin) 

1441 metadata_reprs = ", ".join(repr(arg) for arg in metadata) 

1442 return f'{cls}[{tp_repr}, {metadata_reprs}]' 

1443 

1444 def _subs_tree(self, tvars=None, args=None): # noqa 

1445 if self is Annotated: 

1446 return Annotated 

1447 res = super()._subs_tree(tvars=tvars, args=args) 

1448 # Flatten nested Annotated 

1449 if isinstance(res[1], tuple) and res[1][0] is Annotated: 

1450 sub_tp = res[1][1] 

1451 sub_annot = res[1][2] 

1452 return (Annotated, sub_tp, sub_annot + res[2]) 

1453 return res 

1454 

1455 def _get_cons(self): 

1456 """Return the class used to create instance of this type.""" 

1457 if self.__origin__ is None: 

1458 raise TypeError("Cannot get the underlying type of a " 

1459 "non-specialized Annotated type.") 

1460 tree = self._subs_tree() 

1461 while isinstance(tree, tuple) and tree[0] is Annotated: 

1462 tree = tree[1] 

1463 if isinstance(tree, tuple): 

1464 return tree[0] 

1465 else: 

1466 return tree 

1467 

1468 @typing._tp_cache 

1469 def __getitem__(self, params): 

1470 if not isinstance(params, tuple): 

1471 params = (params,) 

1472 if self.__origin__ is not None: # specializing an instantiated type 

1473 return super().__getitem__(params) 

1474 elif not isinstance(params, tuple) or len(params) < 2: 

1475 raise TypeError("Annotated[...] should be instantiated " 

1476 "with at least two arguments (a type and an " 

1477 "annotation).") 

1478 else: 

1479 if ( 

1480 isinstance(params[0], typing._TypingBase) and 

1481 type(params[0]).__name__ == "_ClassVar" 

1482 ): 

1483 tp = params[0] 

1484 else: 

1485 msg = "Annotated[t, ...]: t must be a type." 

1486 tp = typing._type_check(params[0], msg) 

1487 metadata = tuple(params[1:]) 

1488 return self.__class__( 

1489 self.__name__, 

1490 self.__bases__, 

1491 _no_slots_copy(self.__dict__), 

1492 tvars=_type_vars((tp,)), 

1493 # Metadata is a tuple so it won't be touched by _replace_args et al. 

1494 args=(tp, metadata), 

1495 origin=self, 

1496 ) 

1497 

1498 def __call__(self, *args, **kwargs): 

1499 cons = self._get_cons() 

1500 result = cons(*args, **kwargs) 

1501 try: 

1502 result.__orig_class__ = self 

1503 except AttributeError: 

1504 pass 

1505 return result 

1506 

1507 def __getattr__(self, attr): 

1508 # For simplicity we just don't relay all dunder names 

1509 if self.__origin__ is not None and not _is_dunder(attr): 

1510 return getattr(self._get_cons(), attr) 

1511 raise AttributeError(attr) 

1512 

1513 def __setattr__(self, attr, value): 

1514 if _is_dunder(attr) or attr.startswith('_abc_'): 

1515 super().__setattr__(attr, value) 

1516 elif self.__origin__ is None: 

1517 raise AttributeError(attr) 

1518 else: 

1519 setattr(self._get_cons(), attr, value) 

1520 

1521 def __instancecheck__(self, obj): 

1522 raise TypeError("Annotated cannot be used with isinstance().") 

1523 

1524 def __subclasscheck__(self, cls): 

1525 raise TypeError("Annotated cannot be used with issubclass().") 

1526 

1527 class Annotated(metaclass=AnnotatedMeta): 

1528 """Add context specific metadata to a type. 

1529 

1530 Example: Annotated[int, runtime_check.Unsigned] indicates to the 

1531 hypothetical runtime_check module that this type is an unsigned int. 

1532 Every other consumer of this type can ignore this metadata and treat 

1533 this type as int. 

1534 

1535 The first argument to Annotated must be a valid type, the remaining 

1536 arguments are kept as a tuple in the __metadata__ field. 

1537 

1538 Details: 

1539 

1540 - It's an error to call `Annotated` with less than two arguments. 

1541 - Nested Annotated are flattened:: 

1542 

1543 Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3] 

1544 

1545 - Instantiating an annotated type is equivalent to instantiating the 

1546 underlying type:: 

1547 

1548 Annotated[C, Ann1](5) == C(5) 

1549 

1550 - Annotated can be used as a generic type alias:: 

1551 

1552 Optimized = Annotated[T, runtime.Optimize()] 

1553 Optimized[int] == Annotated[int, runtime.Optimize()] 

1554 

1555 OptimizedList = Annotated[List[T], runtime.Optimize()] 

1556 OptimizedList[int] == Annotated[List[int], runtime.Optimize()] 

1557 """ 

1558 

1559# Python 3.8 has get_origin() and get_args() but those implementations aren't 

1560# Annotated-aware, so we can't use those. Python 3.9's versions don't support 

1561# ParamSpecArgs and ParamSpecKwargs, so only Python 3.10's versions will do. 

1562if sys.version_info[:2] >= (3, 10): 

1563 get_origin = typing.get_origin 

1564 get_args = typing.get_args 

1565# 3.7-3.9 

1566elif PEP_560: 

1567 try: 

1568 # 3.9+ 

1569 from typing import _BaseGenericAlias 

1570 except ImportError: 

1571 _BaseGenericAlias = typing._GenericAlias 

1572 try: 

1573 # 3.9+ 

1574 from typing import GenericAlias 

1575 except ImportError: 

1576 GenericAlias = typing._GenericAlias 

1577 

1578 def get_origin(tp): 

1579 """Get the unsubscripted version of a type. 

1580 

1581 This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar 

1582 and Annotated. Return None for unsupported types. Examples:: 

1583 

1584 get_origin(Literal[42]) is Literal 

1585 get_origin(int) is None 

1586 get_origin(ClassVar[int]) is ClassVar 

1587 get_origin(Generic) is Generic 

1588 get_origin(Generic[T]) is Generic 

1589 get_origin(Union[T, int]) is Union 

1590 get_origin(List[Tuple[T, T]][int]) == list 

1591 get_origin(P.args) is P 

1592 """ 

1593 if isinstance(tp, _AnnotatedAlias): 

1594 return Annotated 

1595 if isinstance(tp, (typing._GenericAlias, GenericAlias, _BaseGenericAlias, 

1596 ParamSpecArgs, ParamSpecKwargs)): 

1597 return tp.__origin__ 

1598 if tp is typing.Generic: 

1599 return typing.Generic 

1600 return None 

1601 

1602 def get_args(tp): 

1603 """Get type arguments with all substitutions performed. 

1604 

1605 For unions, basic simplifications used by Union constructor are performed. 

1606 Examples:: 

1607 get_args(Dict[str, int]) == (str, int) 

1608 get_args(int) == () 

1609 get_args(Union[int, Union[T, int], str][int]) == (int, str) 

1610 get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int]) 

1611 get_args(Callable[[], T][int]) == ([], int) 

1612 """ 

1613 if isinstance(tp, _AnnotatedAlias): 

1614 return (tp.__origin__,) + tp.__metadata__ 

1615 if isinstance(tp, (typing._GenericAlias, GenericAlias)): 

1616 if getattr(tp, "_special", False): 

1617 return () 

1618 res = tp.__args__ 

1619 if get_origin(tp) is collections.abc.Callable and res[0] is not Ellipsis: 

1620 res = (list(res[:-1]), res[-1]) 

1621 return res 

1622 return () 

1623 

1624 

1625# 3.10+ 

1626if hasattr(typing, 'TypeAlias'): 

1627 TypeAlias = typing.TypeAlias 

1628# 3.9 

1629elif sys.version_info[:2] >= (3, 9): 

1630 class _TypeAliasForm(typing._SpecialForm, _root=True): 

1631 def __repr__(self): 

1632 return 'typing_extensions.' + self._name 

1633 

1634 @_TypeAliasForm 

1635 def TypeAlias(self, parameters): 

1636 """Special marker indicating that an assignment should 

1637 be recognized as a proper type alias definition by type 

1638 checkers. 

1639 

1640 For example:: 

1641 

1642 Predicate: TypeAlias = Callable[..., bool] 

1643 

1644 It's invalid when used anywhere except as in the example above. 

1645 """ 

1646 raise TypeError(f"{self} is not subscriptable") 

1647# 3.7-3.8 

1648elif sys.version_info[:2] >= (3, 7): 

1649 class _TypeAliasForm(typing._SpecialForm, _root=True): 

1650 def __repr__(self): 

1651 return 'typing_extensions.' + self._name 

1652 

1653 TypeAlias = _TypeAliasForm('TypeAlias', 

1654 doc="""Special marker indicating that an assignment should 

1655 be recognized as a proper type alias definition by type 

1656 checkers. 

1657 

1658 For example:: 

1659 

1660 Predicate: TypeAlias = Callable[..., bool] 

1661 

1662 It's invalid when used anywhere except as in the example 

1663 above.""") 

1664# 3.6 

1665else: 

1666 class _TypeAliasMeta(typing.TypingMeta): 

1667 """Metaclass for TypeAlias""" 

1668 

1669 def __repr__(self): 

1670 return 'typing_extensions.TypeAlias' 

1671 

1672 class _TypeAliasBase(typing._FinalTypingBase, metaclass=_TypeAliasMeta, _root=True): 

1673 """Special marker indicating that an assignment should 

1674 be recognized as a proper type alias definition by type 

1675 checkers. 

1676 

1677 For example:: 

1678 

1679 Predicate: TypeAlias = Callable[..., bool] 

1680 

1681 It's invalid when used anywhere except as in the example above. 

1682 """ 

1683 __slots__ = () 

1684 

1685 def __instancecheck__(self, obj): 

1686 raise TypeError("TypeAlias cannot be used with isinstance().") 

1687 

1688 def __subclasscheck__(self, cls): 

1689 raise TypeError("TypeAlias cannot be used with issubclass().") 

1690 

1691 def __repr__(self): 

1692 return 'typing_extensions.TypeAlias' 

1693 

1694 TypeAlias = _TypeAliasBase(_root=True) 

1695 

1696 

1697# Python 3.10+ has PEP 612 

1698if hasattr(typing, 'ParamSpecArgs'): 

1699 ParamSpecArgs = typing.ParamSpecArgs 

1700 ParamSpecKwargs = typing.ParamSpecKwargs 

1701# 3.6-3.9 

1702else: 

1703 class _Immutable: 

1704 """Mixin to indicate that object should not be copied.""" 

1705 __slots__ = () 

1706 

1707 def __copy__(self): 

1708 return self 

1709 

1710 def __deepcopy__(self, memo): 

1711 return self 

1712 

1713 class ParamSpecArgs(_Immutable): 

1714 """The args for a ParamSpec object. 

1715 

1716 Given a ParamSpec object P, P.args is an instance of ParamSpecArgs. 

1717 

1718 ParamSpecArgs objects have a reference back to their ParamSpec: 

1719 

1720 P.args.__origin__ is P 

1721 

1722 This type is meant for runtime introspection and has no special meaning to 

1723 static type checkers. 

1724 """ 

1725 def __init__(self, origin): 

1726 self.__origin__ = origin 

1727 

1728 def __repr__(self): 

1729 return f"{self.__origin__.__name__}.args" 

1730 

1731 def __eq__(self, other): 

1732 if not isinstance(other, ParamSpecArgs): 

1733 return NotImplemented 

1734 return self.__origin__ == other.__origin__ 

1735 

1736 class ParamSpecKwargs(_Immutable): 

1737 """The kwargs for a ParamSpec object. 

1738 

1739 Given a ParamSpec object P, P.kwargs is an instance of ParamSpecKwargs. 

1740 

1741 ParamSpecKwargs objects have a reference back to their ParamSpec: 

1742 

1743 P.kwargs.__origin__ is P 

1744 

1745 This type is meant for runtime introspection and has no special meaning to 

1746 static type checkers. 

1747 """ 

1748 def __init__(self, origin): 

1749 self.__origin__ = origin 

1750 

1751 def __repr__(self): 

1752 return f"{self.__origin__.__name__}.kwargs" 

1753 

1754 def __eq__(self, other): 

1755 if not isinstance(other, ParamSpecKwargs): 

1756 return NotImplemented 

1757 return self.__origin__ == other.__origin__ 

1758 

1759# 3.10+ 

1760if hasattr(typing, 'ParamSpec'): 

1761 ParamSpec = typing.ParamSpec 

1762# 3.6-3.9 

1763else: 

1764 

1765 # Inherits from list as a workaround for Callable checks in Python < 3.9.2. 

1766 class ParamSpec(list): 

1767 """Parameter specification variable. 

1768 

1769 Usage:: 

1770 

1771 P = ParamSpec('P') 

1772 

1773 Parameter specification variables exist primarily for the benefit of static 

1774 type checkers. They are used to forward the parameter types of one 

1775 callable to another callable, a pattern commonly found in higher order 

1776 functions and decorators. They are only valid when used in ``Concatenate``, 

1777 or s the first argument to ``Callable``. In Python 3.10 and higher, 

1778 they are also supported in user-defined Generics at runtime. 

1779 See class Generic for more information on generic types. An 

1780 example for annotating a decorator:: 

1781 

1782 T = TypeVar('T') 

1783 P = ParamSpec('P') 

1784 

1785 def add_logging(f: Callable[P, T]) -> Callable[P, T]: 

1786 '''A type-safe decorator to add logging to a function.''' 

1787 def inner(*args: P.args, **kwargs: P.kwargs) -> T: 

1788 logging.info(f'{f.__name__} was called') 

1789 return f(*args, **kwargs) 

1790 return inner 

1791 

1792 @add_logging 

1793 def add_two(x: float, y: float) -> float: 

1794 '''Add two numbers together.''' 

1795 return x + y 

1796 

1797 Parameter specification variables defined with covariant=True or 

1798 contravariant=True can be used to declare covariant or contravariant 

1799 generic types. These keyword arguments are valid, but their actual semantics 

1800 are yet to be decided. See PEP 612 for details. 

1801 

1802 Parameter specification variables can be introspected. e.g.: 

1803 

1804 P.__name__ == 'T' 

1805 P.__bound__ == None 

1806 P.__covariant__ == False 

1807 P.__contravariant__ == False 

1808 

1809 Note that only parameter specification variables defined in global scope can 

1810 be pickled. 

1811 """ 

1812 

1813 # Trick Generic __parameters__. 

1814 __class__ = typing.TypeVar 

1815 

1816 @property 

1817 def args(self): 

1818 return ParamSpecArgs(self) 

1819 

1820 @property 

1821 def kwargs(self): 

1822 return ParamSpecKwargs(self) 

1823 

1824 def __init__(self, name, *, bound=None, covariant=False, contravariant=False): 

1825 super().__init__([self]) 

1826 self.__name__ = name 

1827 self.__covariant__ = bool(covariant) 

1828 self.__contravariant__ = bool(contravariant) 

1829 if bound: 

1830 self.__bound__ = typing._type_check(bound, 'Bound must be a type.') 

1831 else: 

1832 self.__bound__ = None 

1833 

1834 # for pickling: 

1835 try: 

1836 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') 

1837 except (AttributeError, ValueError): 

1838 def_mod = None 

1839 if def_mod != 'typing_extensions': 

1840 self.__module__ = def_mod 

1841 

1842 def __repr__(self): 

1843 if self.__covariant__: 

1844 prefix = '+' 

1845 elif self.__contravariant__: 

1846 prefix = '-' 

1847 else: 

1848 prefix = '~' 

1849 return prefix + self.__name__ 

1850 

1851 def __hash__(self): 

1852 return object.__hash__(self) 

1853 

1854 def __eq__(self, other): 

1855 return self is other 

1856 

1857 def __reduce__(self): 

1858 return self.__name__ 

1859 

1860 # Hack to get typing._type_check to pass. 

1861 def __call__(self, *args, **kwargs): 

1862 pass 

1863 

1864 if not PEP_560: 

1865 # Only needed in 3.6. 

1866 def _get_type_vars(self, tvars): 

1867 if self not in tvars: 

1868 tvars.append(self) 

1869 

1870 

1871# 3.6-3.9 

1872if not hasattr(typing, 'Concatenate'): 

1873 # Inherits from list as a workaround for Callable checks in Python < 3.9.2. 

1874 class _ConcatenateGenericAlias(list): 

1875 

1876 # Trick Generic into looking into this for __parameters__. 

1877 if PEP_560: 

1878 __class__ = typing._GenericAlias 

1879 else: 

1880 __class__ = typing._TypingBase 

1881 

1882 # Flag in 3.8. 

1883 _special = False 

1884 # Attribute in 3.6 and earlier. 

1885 _gorg = typing.Generic 

1886 

1887 def __init__(self, origin, args): 

1888 super().__init__(args) 

1889 self.__origin__ = origin 

1890 self.__args__ = args 

1891 

1892 def __repr__(self): 

1893 _type_repr = typing._type_repr 

1894 return (f'{_type_repr(self.__origin__)}' 

1895 f'[{", ".join(_type_repr(arg) for arg in self.__args__)}]') 

1896 

1897 def __hash__(self): 

1898 return hash((self.__origin__, self.__args__)) 

1899 

1900 # Hack to get typing._type_check to pass in Generic. 

1901 def __call__(self, *args, **kwargs): 

1902 pass 

1903 

1904 @property 

1905 def __parameters__(self): 

1906 return tuple( 

1907 tp for tp in self.__args__ if isinstance(tp, (typing.TypeVar, ParamSpec)) 

1908 ) 

1909 

1910 if not PEP_560: 

1911 # Only required in 3.6. 

1912 def _get_type_vars(self, tvars): 

1913 if self.__origin__ and self.__parameters__: 

1914 typing._get_type_vars(self.__parameters__, tvars) 

1915 

1916 

1917# 3.6-3.9 

1918@typing._tp_cache 

1919def _concatenate_getitem(self, parameters): 

1920 if parameters == (): 

1921 raise TypeError("Cannot take a Concatenate of no types.") 

1922 if not isinstance(parameters, tuple): 

1923 parameters = (parameters,) 

1924 if not isinstance(parameters[-1], ParamSpec): 

1925 raise TypeError("The last parameter to Concatenate should be a " 

1926 "ParamSpec variable.") 

1927 msg = "Concatenate[arg, ...]: each arg must be a type." 

1928 parameters = tuple(typing._type_check(p, msg) for p in parameters) 

1929 return _ConcatenateGenericAlias(self, parameters) 

1930 

1931 

1932# 3.10+ 

1933if hasattr(typing, 'Concatenate'): 

1934 Concatenate = typing.Concatenate 

1935 _ConcatenateGenericAlias = typing._ConcatenateGenericAlias # noqa 

1936# 3.9 

1937elif sys.version_info[:2] >= (3, 9): 

1938 @_TypeAliasForm 

1939 def Concatenate(self, parameters): 

1940 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a 

1941 higher order function which adds, removes or transforms parameters of a 

1942 callable. 

1943 

1944 For example:: 

1945 

1946 Callable[Concatenate[int, P], int] 

1947 

1948 See PEP 612 for detailed information. 

1949 """ 

1950 return _concatenate_getitem(self, parameters) 

1951# 3.7-8 

1952elif sys.version_info[:2] >= (3, 7): 

1953 class _ConcatenateForm(typing._SpecialForm, _root=True): 

1954 def __repr__(self): 

1955 return 'typing_extensions.' + self._name 

1956 

1957 def __getitem__(self, parameters): 

1958 return _concatenate_getitem(self, parameters) 

1959 

1960 Concatenate = _ConcatenateForm( 

1961 'Concatenate', 

1962 doc="""Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a 

1963 higher order function which adds, removes or transforms parameters of a 

1964 callable. 

1965 

1966 For example:: 

1967 

1968 Callable[Concatenate[int, P], int] 

1969 

1970 See PEP 612 for detailed information. 

1971 """) 

1972# 3.6 

1973else: 

1974 class _ConcatenateAliasMeta(typing.TypingMeta): 

1975 """Metaclass for Concatenate.""" 

1976 

1977 def __repr__(self): 

1978 return 'typing_extensions.Concatenate' 

1979 

1980 class _ConcatenateAliasBase(typing._FinalTypingBase, 

1981 metaclass=_ConcatenateAliasMeta, 

1982 _root=True): 

1983 """Used in conjunction with ``ParamSpec`` and ``Callable`` to represent a 

1984 higher order function which adds, removes or transforms parameters of a 

1985 callable. 

1986 

1987 For example:: 

1988 

1989 Callable[Concatenate[int, P], int] 

1990 

1991 See PEP 612 for detailed information. 

1992 """ 

1993 __slots__ = () 

1994 

1995 def __instancecheck__(self, obj): 

1996 raise TypeError("Concatenate cannot be used with isinstance().") 

1997 

1998 def __subclasscheck__(self, cls): 

1999 raise TypeError("Concatenate cannot be used with issubclass().") 

2000 

2001 def __repr__(self): 

2002 return 'typing_extensions.Concatenate' 

2003 

2004 def __getitem__(self, parameters): 

2005 return _concatenate_getitem(self, parameters) 

2006 

2007 Concatenate = _ConcatenateAliasBase(_root=True) 

2008 

2009# 3.10+ 

2010if hasattr(typing, 'TypeGuard'): 

2011 TypeGuard = typing.TypeGuard 

2012# 3.9 

2013elif sys.version_info[:2] >= (3, 9): 

2014 class _TypeGuardForm(typing._SpecialForm, _root=True): 

2015 def __repr__(self): 

2016 return 'typing_extensions.' + self._name 

2017 

2018 @_TypeGuardForm 

2019 def TypeGuard(self, parameters): 

2020 """Special typing form used to annotate the return type of a user-defined 

2021 type guard function. ``TypeGuard`` only accepts a single type argument. 

2022 At runtime, functions marked this way should return a boolean. 

2023 

2024 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static 

2025 type checkers to determine a more precise type of an expression within a 

2026 program's code flow. Usually type narrowing is done by analyzing 

2027 conditional code flow and applying the narrowing to a block of code. The 

2028 conditional expression here is sometimes referred to as a "type guard". 

2029 

2030 Sometimes it would be convenient to use a user-defined boolean function 

2031 as a type guard. Such a function should use ``TypeGuard[...]`` as its 

2032 return type to alert static type checkers to this intention. 

2033 

2034 Using ``-> TypeGuard`` tells the static type checker that for a given 

2035 function: 

2036 

2037 1. The return value is a boolean. 

2038 2. If the return value is ``True``, the type of its argument 

2039 is the type inside ``TypeGuard``. 

2040 

2041 For example:: 

2042 

2043 def is_str(val: Union[str, float]): 

2044 # "isinstance" type guard 

2045 if isinstance(val, str): 

2046 # Type of ``val`` is narrowed to ``str`` 

2047 ... 

2048 else: 

2049 # Else, type of ``val`` is narrowed to ``float``. 

2050 ... 

2051 

2052 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower 

2053 form of ``TypeA`` (it can even be a wider form) and this may lead to 

2054 type-unsafe results. The main reason is to allow for things like 

2055 narrowing ``List[object]`` to ``List[str]`` even though the latter is not 

2056 a subtype of the former, since ``List`` is invariant. The responsibility of 

2057 writing type-safe type guards is left to the user. 

2058 

2059 ``TypeGuard`` also works with type variables. For more information, see 

2060 PEP 647 (User-Defined Type Guards). 

2061 """ 

2062 item = typing._type_check(parameters, f'{self} accepts only single type.') 

2063 return typing._GenericAlias(self, (item,)) 

2064# 3.7-3.8 

2065elif sys.version_info[:2] >= (3, 7): 

2066 class _TypeGuardForm(typing._SpecialForm, _root=True): 

2067 

2068 def __repr__(self): 

2069 return 'typing_extensions.' + self._name 

2070 

2071 def __getitem__(self, parameters): 

2072 item = typing._type_check(parameters, 

2073 f'{self._name} accepts only a single type') 

2074 return typing._GenericAlias(self, (item,)) 

2075 

2076 TypeGuard = _TypeGuardForm( 

2077 'TypeGuard', 

2078 doc="""Special typing form used to annotate the return type of a user-defined 

2079 type guard function. ``TypeGuard`` only accepts a single type argument. 

2080 At runtime, functions marked this way should return a boolean. 

2081 

2082 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static 

2083 type checkers to determine a more precise type of an expression within a 

2084 program's code flow. Usually type narrowing is done by analyzing 

2085 conditional code flow and applying the narrowing to a block of code. The 

2086 conditional expression here is sometimes referred to as a "type guard". 

2087 

2088 Sometimes it would be convenient to use a user-defined boolean function 

2089 as a type guard. Such a function should use ``TypeGuard[...]`` as its 

2090 return type to alert static type checkers to this intention. 

2091 

2092 Using ``-> TypeGuard`` tells the static type checker that for a given 

2093 function: 

2094 

2095 1. The return value is a boolean. 

2096 2. If the return value is ``True``, the type of its argument 

2097 is the type inside ``TypeGuard``. 

2098 

2099 For example:: 

2100 

2101 def is_str(val: Union[str, float]): 

2102 # "isinstance" type guard 

2103 if isinstance(val, str): 

2104 # Type of ``val`` is narrowed to ``str`` 

2105 ... 

2106 else: 

2107 # Else, type of ``val`` is narrowed to ``float``. 

2108 ... 

2109 

2110 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower 

2111 form of ``TypeA`` (it can even be a wider form) and this may lead to 

2112 type-unsafe results. The main reason is to allow for things like 

2113 narrowing ``List[object]`` to ``List[str]`` even though the latter is not 

2114 a subtype of the former, since ``List`` is invariant. The responsibility of 

2115 writing type-safe type guards is left to the user. 

2116 

2117 ``TypeGuard`` also works with type variables. For more information, see 

2118 PEP 647 (User-Defined Type Guards). 

2119 """) 

2120# 3.6 

2121else: 

2122 class _TypeGuard(typing._FinalTypingBase, _root=True): 

2123 """Special typing form used to annotate the return type of a user-defined 

2124 type guard function. ``TypeGuard`` only accepts a single type argument. 

2125 At runtime, functions marked this way should return a boolean. 

2126 

2127 ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static 

2128 type checkers to determine a more precise type of an expression within a 

2129 program's code flow. Usually type narrowing is done by analyzing 

2130 conditional code flow and applying the narrowing to a block of code. The 

2131 conditional expression here is sometimes referred to as a "type guard". 

2132 

2133 Sometimes it would be convenient to use a user-defined boolean function 

2134 as a type guard. Such a function should use ``TypeGuard[...]`` as its 

2135 return type to alert static type checkers to this intention. 

2136 

2137 Using ``-> TypeGuard`` tells the static type checker that for a given 

2138 function: 

2139 

2140 1. The return value is a boolean. 

2141 2. If the return value is ``True``, the type of its argument 

2142 is the type inside ``TypeGuard``. 

2143 

2144 For example:: 

2145 

2146 def is_str(val: Union[str, float]): 

2147 # "isinstance" type guard 

2148 if isinstance(val, str): 

2149 # Type of ``val`` is narrowed to ``str`` 

2150 ... 

2151 else: 

2152 # Else, type of ``val`` is narrowed to ``float``. 

2153 ... 

2154 

2155 Strict type narrowing is not enforced -- ``TypeB`` need not be a narrower 

2156 form of ``TypeA`` (it can even be a wider form) and this may lead to 

2157 type-unsafe results. The main reason is to allow for things like 

2158 narrowing ``List[object]`` to ``List[str]`` even though the latter is not 

2159 a subtype of the former, since ``List`` is invariant. The responsibility of 

2160 writing type-safe type guards is left to the user. 

2161 

2162 ``TypeGuard`` also works with type variables. For more information, see 

2163 PEP 647 (User-Defined Type Guards). 

2164 """ 

2165 

2166 __slots__ = ('__type__',) 

2167 

2168 def __init__(self, tp=None, **kwds): 

2169 self.__type__ = tp 

2170 

2171 def __getitem__(self, item): 

2172 cls = type(self) 

2173 if self.__type__ is None: 

2174 return cls(typing._type_check(item, 

2175 f'{cls.__name__[1:]} accepts only a single type.'), 

2176 _root=True) 

2177 raise TypeError(f'{cls.__name__[1:]} cannot be further subscripted') 

2178 

2179 def _eval_type(self, globalns, localns): 

2180 new_tp = typing._eval_type(self.__type__, globalns, localns) 

2181 if new_tp == self.__type__: 

2182 return self 

2183 return type(self)(new_tp, _root=True) 

2184 

2185 def __repr__(self): 

2186 r = super().__repr__() 

2187 if self.__type__ is not None: 

2188 r += f'[{typing._type_repr(self.__type__)}]' 

2189 return r 

2190 

2191 def __hash__(self): 

2192 return hash((type(self).__name__, self.__type__)) 

2193 

2194 def __eq__(self, other): 

2195 if not isinstance(other, _TypeGuard): 

2196 return NotImplemented 

2197 if self.__type__ is not None: 

2198 return self.__type__ == other.__type__ 

2199 return self is other 

2200 

2201 TypeGuard = _TypeGuard(_root=True) 

2202 

2203 

2204if sys.version_info[:2] >= (3, 7): 

2205 # Vendored from cpython typing._SpecialFrom 

2206 class _SpecialForm(typing._Final, _root=True): 

2207 __slots__ = ('_name', '__doc__', '_getitem') 

2208 

2209 def __init__(self, getitem): 

2210 self._getitem = getitem 

2211 self._name = getitem.__name__ 

2212 self.__doc__ = getitem.__doc__ 

2213 

2214 def __getattr__(self, item): 

2215 if item in {'__name__', '__qualname__'}: 

2216 return self._name 

2217 

2218 raise AttributeError(item) 

2219 

2220 def __mro_entries__(self, bases): 

2221 raise TypeError(f"Cannot subclass {self!r}") 

2222 

2223 def __repr__(self): 

2224 return f'typing_extensions.{self._name}' 

2225 

2226 def __reduce__(self): 

2227 return self._name 

2228 

2229 def __call__(self, *args, **kwds): 

2230 raise TypeError(f"Cannot instantiate {self!r}") 

2231 

2232 def __or__(self, other): 

2233 return typing.Union[self, other] 

2234 

2235 def __ror__(self, other): 

2236 return typing.Union[other, self] 

2237 

2238 def __instancecheck__(self, obj): 

2239 raise TypeError(f"{self} cannot be used with isinstance()") 

2240 

2241 def __subclasscheck__(self, cls): 

2242 raise TypeError(f"{self} cannot be used with issubclass()") 

2243 

2244 @typing._tp_cache 

2245 def __getitem__(self, parameters): 

2246 return self._getitem(self, parameters) 

2247 

2248 

2249if hasattr(typing, "LiteralString"): 

2250 LiteralString = typing.LiteralString 

2251elif sys.version_info[:2] >= (3, 7): 

2252 @_SpecialForm 

2253 def LiteralString(self, params): 

2254 """Represents an arbitrary literal string. 

2255 

2256 Example:: 

2257 

2258 from typing_extensions import LiteralString 

2259 

2260 def query(sql: LiteralString) -> ...: 

2261 ... 

2262 

2263 query("SELECT * FROM table") # ok 

2264 query(f"SELECT * FROM {input()}") # not ok 

2265 

2266 See PEP 675 for details. 

2267 

2268 """ 

2269 raise TypeError(f"{self} is not subscriptable") 

2270else: 

2271 class _LiteralString(typing._FinalTypingBase, _root=True): 

2272 """Represents an arbitrary literal string. 

2273 

2274 Example:: 

2275 

2276 from typing_extensions import LiteralString 

2277 

2278 def query(sql: LiteralString) -> ...: 

2279 ... 

2280 

2281 query("SELECT * FROM table") # ok 

2282 query(f"SELECT * FROM {input()}") # not ok 

2283 

2284 See PEP 675 for details. 

2285 

2286 """ 

2287 

2288 __slots__ = () 

2289 

2290 def __instancecheck__(self, obj): 

2291 raise TypeError(f"{self} cannot be used with isinstance().") 

2292 

2293 def __subclasscheck__(self, cls): 

2294 raise TypeError(f"{self} cannot be used with issubclass().") 

2295 

2296 LiteralString = _LiteralString(_root=True) 

2297 

2298 

2299if hasattr(typing, "Self"): 

2300 Self = typing.Self 

2301elif sys.version_info[:2] >= (3, 7): 

2302 @_SpecialForm 

2303 def Self(self, params): 

2304 """Used to spell the type of "self" in classes. 

2305 

2306 Example:: 

2307 

2308 from typing import Self 

2309 

2310 class ReturnsSelf: 

2311 def parse(self, data: bytes) -> Self: 

2312 ... 

2313 return self 

2314 

2315 """ 

2316 

2317 raise TypeError(f"{self} is not subscriptable") 

2318else: 

2319 class _Self(typing._FinalTypingBase, _root=True): 

2320 """Used to spell the type of "self" in classes. 

2321 

2322 Example:: 

2323 

2324 from typing import Self 

2325 

2326 class ReturnsSelf: 

2327 def parse(self, data: bytes) -> Self: 

2328 ... 

2329 return self 

2330 

2331 """ 

2332 

2333 __slots__ = () 

2334 

2335 def __instancecheck__(self, obj): 

2336 raise TypeError(f"{self} cannot be used with isinstance().") 

2337 

2338 def __subclasscheck__(self, cls): 

2339 raise TypeError(f"{self} cannot be used with issubclass().") 

2340 

2341 Self = _Self(_root=True) 

2342 

2343 

2344if hasattr(typing, "Never"): 

2345 Never = typing.Never 

2346elif sys.version_info[:2] >= (3, 7): 

2347 @_SpecialForm 

2348 def Never(self, params): 

2349 """The bottom type, a type that has no members. 

2350 

2351 This can be used to define a function that should never be 

2352 called, or a function that never returns:: 

2353 

2354 from typing_extensions import Never 

2355 

2356 def never_call_me(arg: Never) -> None: 

2357 pass 

2358 

2359 def int_or_str(arg: int | str) -> None: 

2360 never_call_me(arg) # type checker error 

2361 match arg: 

2362 case int(): 

2363 print("It's an int") 

2364 case str(): 

2365 print("It's a str") 

2366 case _: 

2367 never_call_me(arg) # ok, arg is of type Never 

2368 

2369 """ 

2370 

2371 raise TypeError(f"{self} is not subscriptable") 

2372else: 

2373 class _Never(typing._FinalTypingBase, _root=True): 

2374 """The bottom type, a type that has no members. 

2375 

2376 This can be used to define a function that should never be 

2377 called, or a function that never returns:: 

2378 

2379 from typing_extensions import Never 

2380 

2381 def never_call_me(arg: Never) -> None: 

2382 pass 

2383 

2384 def int_or_str(arg: int | str) -> None: 

2385 never_call_me(arg) # type checker error 

2386 match arg: 

2387 case int(): 

2388 print("It's an int") 

2389 case str(): 

2390 print("It's a str") 

2391 case _: 

2392 never_call_me(arg) # ok, arg is of type Never 

2393 

2394 """ 

2395 

2396 __slots__ = () 

2397 

2398 def __instancecheck__(self, obj): 

2399 raise TypeError(f"{self} cannot be used with isinstance().") 

2400 

2401 def __subclasscheck__(self, cls): 

2402 raise TypeError(f"{self} cannot be used with issubclass().") 

2403 

2404 Never = _Never(_root=True) 

2405 

2406 

2407if hasattr(typing, 'Required'): 

2408 Required = typing.Required 

2409 NotRequired = typing.NotRequired 

2410elif sys.version_info[:2] >= (3, 9): 

2411 class _ExtensionsSpecialForm(typing._SpecialForm, _root=True): 

2412 def __repr__(self): 

2413 return 'typing_extensions.' + self._name 

2414 

2415 @_ExtensionsSpecialForm 

2416 def Required(self, parameters): 

2417 """A special typing construct to mark a key of a total=False TypedDict 

2418 as required. For example: 

2419 

2420 class Movie(TypedDict, total=False): 

2421 title: Required[str] 

2422 year: int 

2423 

2424 m = Movie( 

2425 title='The Matrix', # typechecker error if key is omitted 

2426 year=1999, 

2427 ) 

2428 

2429 There is no runtime checking that a required key is actually provided 

2430 when instantiating a related TypedDict. 

2431 """ 

2432 item = typing._type_check(parameters, f'{self._name} accepts only single type') 

2433 return typing._GenericAlias(self, (item,)) 

2434 

2435 @_ExtensionsSpecialForm 

2436 def NotRequired(self, parameters): 

2437 """A special typing construct to mark a key of a TypedDict as 

2438 potentially missing. For example: 

2439 

2440 class Movie(TypedDict): 

2441 title: str 

2442 year: NotRequired[int] 

2443 

2444 m = Movie( 

2445 title='The Matrix', # typechecker error if key is omitted 

2446 year=1999, 

2447 ) 

2448 """ 

2449 item = typing._type_check(parameters, f'{self._name} accepts only single type') 

2450 return typing._GenericAlias(self, (item,)) 

2451 

2452elif sys.version_info[:2] >= (3, 7): 

2453 class _RequiredForm(typing._SpecialForm, _root=True): 

2454 def __repr__(self): 

2455 return 'typing_extensions.' + self._name 

2456 

2457 def __getitem__(self, parameters): 

2458 item = typing._type_check(parameters, 

2459 '{} accepts only single type'.format(self._name)) 

2460 return typing._GenericAlias(self, (item,)) 

2461 

2462 Required = _RequiredForm( 

2463 'Required', 

2464 doc="""A special typing construct to mark a key of a total=False TypedDict 

2465 as required. For example: 

2466 

2467 class Movie(TypedDict, total=False): 

2468 title: Required[str] 

2469 year: int 

2470 

2471 m = Movie( 

2472 title='The Matrix', # typechecker error if key is omitted 

2473 year=1999, 

2474 ) 

2475 

2476 There is no runtime checking that a required key is actually provided 

2477 when instantiating a related TypedDict. 

2478 """) 

2479 NotRequired = _RequiredForm( 

2480 'NotRequired', 

2481 doc="""A special typing construct to mark a key of a TypedDict as 

2482 potentially missing. For example: 

2483 

2484 class Movie(TypedDict): 

2485 title: str 

2486 year: NotRequired[int] 

2487 

2488 m = Movie( 

2489 title='The Matrix', # typechecker error if key is omitted 

2490 year=1999, 

2491 ) 

2492 """) 

2493else: 

2494 # NOTE: Modeled after _Final's implementation when _FinalTypingBase available 

2495 class _MaybeRequired(typing._FinalTypingBase, _root=True): 

2496 __slots__ = ('__type__',) 

2497 

2498 def __init__(self, tp=None, **kwds): 

2499 self.__type__ = tp 

2500 

2501 def __getitem__(self, item): 

2502 cls = type(self) 

2503 if self.__type__ is None: 

2504 return cls(typing._type_check(item, 

2505 '{} accepts only single type.'.format(cls.__name__[1:])), 

2506 _root=True) 

2507 raise TypeError('{} cannot be further subscripted' 

2508 .format(cls.__name__[1:])) 

2509 

2510 def _eval_type(self, globalns, localns): 

2511 new_tp = typing._eval_type(self.__type__, globalns, localns) 

2512 if new_tp == self.__type__: 

2513 return self 

2514 return type(self)(new_tp, _root=True) 

2515 

2516 def __repr__(self): 

2517 r = super().__repr__() 

2518 if self.__type__ is not None: 

2519 r += '[{}]'.format(typing._type_repr(self.__type__)) 

2520 return r 

2521 

2522 def __hash__(self): 

2523 return hash((type(self).__name__, self.__type__)) 

2524 

2525 def __eq__(self, other): 

2526 if not isinstance(other, type(self)): 

2527 return NotImplemented 

2528 if self.__type__ is not None: 

2529 return self.__type__ == other.__type__ 

2530 return self is other 

2531 

2532 class _Required(_MaybeRequired, _root=True): 

2533 """A special typing construct to mark a key of a total=False TypedDict 

2534 as required. For example: 

2535 

2536 class Movie(TypedDict, total=False): 

2537 title: Required[str] 

2538 year: int 

2539 

2540 m = Movie( 

2541 title='The Matrix', # typechecker error if key is omitted 

2542 year=1999, 

2543 ) 

2544 

2545 There is no runtime checking that a required key is actually provided 

2546 when instantiating a related TypedDict. 

2547 """ 

2548 

2549 class _NotRequired(_MaybeRequired, _root=True): 

2550 """A special typing construct to mark a key of a TypedDict as 

2551 potentially missing. For example: 

2552 

2553 class Movie(TypedDict): 

2554 title: str 

2555 year: NotRequired[int] 

2556 

2557 m = Movie( 

2558 title='The Matrix', # typechecker error if key is omitted 

2559 year=1999, 

2560 ) 

2561 """ 

2562 

2563 Required = _Required(_root=True) 

2564 NotRequired = _NotRequired(_root=True) 

2565 

2566 

2567if sys.version_info[:2] >= (3, 9): 

2568 class _UnpackSpecialForm(typing._SpecialForm, _root=True): 

2569 def __repr__(self): 

2570 return 'typing_extensions.' + self._name 

2571 

2572 class _UnpackAlias(typing._GenericAlias, _root=True): 

2573 __class__ = typing.TypeVar 

2574 

2575 @_UnpackSpecialForm 

2576 def Unpack(self, parameters): 

2577 """A special typing construct to unpack a variadic type. For example: 

2578 

2579 Shape = TypeVarTuple('Shape') 

2580 Batch = NewType('Batch', int) 

2581 

2582 def add_batch_axis( 

2583 x: Array[Unpack[Shape]] 

2584 ) -> Array[Batch, Unpack[Shape]]: ... 

2585 

2586 """ 

2587 item = typing._type_check(parameters, f'{self._name} accepts only single type') 

2588 return _UnpackAlias(self, (item,)) 

2589 

2590 def _is_unpack(obj): 

2591 return isinstance(obj, _UnpackAlias) 

2592 

2593elif sys.version_info[:2] >= (3, 7): 

2594 class _UnpackAlias(typing._GenericAlias, _root=True): 

2595 __class__ = typing.TypeVar 

2596 

2597 class _UnpackForm(typing._SpecialForm, _root=True): 

2598 def __repr__(self): 

2599 return 'typing_extensions.' + self._name 

2600 

2601 def __getitem__(self, parameters): 

2602 item = typing._type_check(parameters, 

2603 f'{self._name} accepts only single type') 

2604 return _UnpackAlias(self, (item,)) 

2605 

2606 Unpack = _UnpackForm( 

2607 'Unpack', 

2608 doc="""A special typing construct to unpack a variadic type. For example: 

2609 

2610 Shape = TypeVarTuple('Shape') 

2611 Batch = NewType('Batch', int) 

2612 

2613 def add_batch_axis( 

2614 x: Array[Unpack[Shape]] 

2615 ) -> Array[Batch, Unpack[Shape]]: ... 

2616 

2617 """) 

2618 

2619 def _is_unpack(obj): 

2620 return isinstance(obj, _UnpackAlias) 

2621 

2622else: 

2623 # NOTE: Modeled after _Final's implementation when _FinalTypingBase available 

2624 class _Unpack(typing._FinalTypingBase, _root=True): 

2625 """A special typing construct to unpack a variadic type. For example: 

2626 

2627 Shape = TypeVarTuple('Shape') 

2628 Batch = NewType('Batch', int) 

2629 

2630 def add_batch_axis( 

2631 x: Array[Unpack[Shape]] 

2632 ) -> Array[Batch, Unpack[Shape]]: ... 

2633 

2634 """ 

2635 __slots__ = ('__type__',) 

2636 __class__ = typing.TypeVar 

2637 

2638 def __init__(self, tp=None, **kwds): 

2639 self.__type__ = tp 

2640 

2641 def __getitem__(self, item): 

2642 cls = type(self) 

2643 if self.__type__ is None: 

2644 return cls(typing._type_check(item, 

2645 'Unpack accepts only single type.'), 

2646 _root=True) 

2647 raise TypeError('Unpack cannot be further subscripted') 

2648 

2649 def _eval_type(self, globalns, localns): 

2650 new_tp = typing._eval_type(self.__type__, globalns, localns) 

2651 if new_tp == self.__type__: 

2652 return self 

2653 return type(self)(new_tp, _root=True) 

2654 

2655 def __repr__(self): 

2656 r = super().__repr__() 

2657 if self.__type__ is not None: 

2658 r += '[{}]'.format(typing._type_repr(self.__type__)) 

2659 return r 

2660 

2661 def __hash__(self): 

2662 return hash((type(self).__name__, self.__type__)) 

2663 

2664 def __eq__(self, other): 

2665 if not isinstance(other, _Unpack): 

2666 return NotImplemented 

2667 if self.__type__ is not None: 

2668 return self.__type__ == other.__type__ 

2669 return self is other 

2670 

2671 # For 3.6 only 

2672 def _get_type_vars(self, tvars): 

2673 self.__type__._get_type_vars(tvars) 

2674 

2675 Unpack = _Unpack(_root=True) 

2676 

2677 def _is_unpack(obj): 

2678 return isinstance(obj, _Unpack) 

2679 

2680 

2681class TypeVarTuple: 

2682 """Type variable tuple. 

2683 

2684 Usage:: 

2685 

2686 Ts = TypeVarTuple('Ts') 

2687 

2688 In the same way that a normal type variable is a stand-in for a single 

2689 type such as ``int``, a type variable *tuple* is a stand-in for a *tuple* type such as 

2690 ``Tuple[int, str]``. 

2691 

2692 Type variable tuples can be used in ``Generic`` declarations. 

2693 Consider the following example:: 

2694 

2695 class Array(Generic[*Ts]): ... 

2696 

2697 The ``Ts`` type variable tuple here behaves like ``tuple[T1, T2]``, 

2698 where ``T1`` and ``T2`` are type variables. To use these type variables 

2699 as type parameters of ``Array``, we must *unpack* the type variable tuple using 

2700 the star operator: ``*Ts``. The signature of ``Array`` then behaves 

2701 as if we had simply written ``class Array(Generic[T1, T2]): ...``. 

2702 In contrast to ``Generic[T1, T2]``, however, ``Generic[*Shape]`` allows 

2703 us to parameterise the class with an *arbitrary* number of type parameters. 

2704 

2705 Type variable tuples can be used anywhere a normal ``TypeVar`` can. 

2706 This includes class definitions, as shown above, as well as function 

2707 signatures and variable annotations:: 

2708 

2709 class Array(Generic[*Ts]): 

2710 

2711 def __init__(self, shape: Tuple[*Ts]): 

2712 self._shape: Tuple[*Ts] = shape 

2713 

2714 def get_shape(self) -> Tuple[*Ts]: 

2715 return self._shape 

2716 

2717 shape = (Height(480), Width(640)) 

2718 x: Array[Height, Width] = Array(shape) 

2719 y = abs(x) # Inferred type is Array[Height, Width] 

2720 z = x + x # ... is Array[Height, Width] 

2721 x.get_shape() # ... is tuple[Height, Width] 

2722 

2723 """ 

2724 

2725 # Trick Generic __parameters__. 

2726 __class__ = typing.TypeVar 

2727 

2728 def __iter__(self): 

2729 yield self.__unpacked__ 

2730 

2731 def __init__(self, name): 

2732 self.__name__ = name 

2733 

2734 # for pickling: 

2735 try: 

2736 def_mod = sys._getframe(1).f_globals.get('__name__', '__main__') 

2737 except (AttributeError, ValueError): 

2738 def_mod = None 

2739 if def_mod != 'typing_extensions': 

2740 self.__module__ = def_mod 

2741 

2742 self.__unpacked__ = Unpack[self] 

2743 

2744 def __repr__(self): 

2745 return self.__name__ 

2746 

2747 def __hash__(self): 

2748 return object.__hash__(self) 

2749 

2750 def __eq__(self, other): 

2751 return self is other 

2752 

2753 def __reduce__(self): 

2754 return self.__name__ 

2755 

2756 def __init_subclass__(self, *args, **kwds): 

2757 if '_root' not in kwds: 

2758 raise TypeError("Cannot subclass special typing classes") 

2759 

2760 if not PEP_560: 

2761 # Only needed in 3.6. 

2762 def _get_type_vars(self, tvars): 

2763 if self not in tvars: 

2764 tvars.append(self) 

2765 

2766 

2767if hasattr(typing, "reveal_type"): 

2768 reveal_type = typing.reveal_type 

2769else: 

2770 def reveal_type(__obj: T) -> T: 

2771 """Reveal the inferred type of a variable. 

2772 

2773 When a static type checker encounters a call to ``reveal_type()``, 

2774 it will emit the inferred type of the argument:: 

2775 

2776 x: int = 1 

2777 reveal_type(x) 

2778 

2779 Running a static type checker (e.g., ``mypy``) on this example 

2780 will produce output similar to 'Revealed type is "builtins.int"'. 

2781 

2782 At runtime, the function prints the runtime type of the 

2783 argument and returns it unchanged. 

2784 

2785 """ 

2786 print(f"Runtime type is {type(__obj).__name__!r}", file=sys.stderr) 

2787 return __obj 

2788 

2789 

2790if hasattr(typing, "assert_never"): 

2791 assert_never = typing.assert_never 

2792else: 

2793 def assert_never(__arg: Never) -> Never: 

2794 """Assert to the type checker that a line of code is unreachable. 

2795 

2796 Example:: 

2797 

2798 def int_or_str(arg: int | str) -> None: 

2799 match arg: 

2800 case int(): 

2801 print("It's an int") 

2802 case str(): 

2803 print("It's a str") 

2804 case _: 

2805 assert_never(arg) 

2806 

2807 If a type checker finds that a call to assert_never() is 

2808 reachable, it will emit an error. 

2809 

2810 At runtime, this throws an exception when called. 

2811 

2812 """ 

2813 raise AssertionError("Expected code to be unreachable") 

2814 

2815 

2816if hasattr(typing, 'dataclass_transform'): 

2817 dataclass_transform = typing.dataclass_transform 

2818else: 

2819 def dataclass_transform( 

2820 *, 

2821 eq_default: bool = True, 

2822 order_default: bool = False, 

2823 kw_only_default: bool = False, 

2824 field_descriptors: typing.Tuple[ 

2825 typing.Union[typing.Type[typing.Any], typing.Callable[..., typing.Any]], 

2826 ... 

2827 ] = (), 

2828 ) -> typing.Callable[[T], T]: 

2829 """Decorator that marks a function, class, or metaclass as providing 

2830 dataclass-like behavior. 

2831 

2832 Example: 

2833 

2834 from typing_extensions import dataclass_transform 

2835 

2836 _T = TypeVar("_T") 

2837 

2838 # Used on a decorator function 

2839 @dataclass_transform() 

2840 def create_model(cls: type[_T]) -> type[_T]: 

2841 ... 

2842 return cls 

2843 

2844 @create_model 

2845 class CustomerModel: 

2846 id: int 

2847 name: str 

2848 

2849 # Used on a base class 

2850 @dataclass_transform() 

2851 class ModelBase: ... 

2852 

2853 class CustomerModel(ModelBase): 

2854 id: int 

2855 name: str 

2856 

2857 # Used on a metaclass 

2858 @dataclass_transform() 

2859 class ModelMeta(type): ... 

2860 

2861 class ModelBase(metaclass=ModelMeta): ... 

2862 

2863 class CustomerModel(ModelBase): 

2864 id: int 

2865 name: str 

2866 

2867 Each of the ``CustomerModel`` classes defined in this example will now 

2868 behave similarly to a dataclass created with the ``@dataclasses.dataclass`` 

2869 decorator. For example, the type checker will synthesize an ``__init__`` 

2870 method. 

2871 

2872 The arguments to this decorator can be used to customize this behavior: 

2873 - ``eq_default`` indicates whether the ``eq`` parameter is assumed to be 

2874 True or False if it is omitted by the caller. 

2875 - ``order_default`` indicates whether the ``order`` parameter is 

2876 assumed to be True or False if it is omitted by the caller. 

2877 - ``kw_only_default`` indicates whether the ``kw_only`` parameter is 

2878 assumed to be True or False if it is omitted by the caller. 

2879 - ``field_descriptors`` specifies a static list of supported classes 

2880 or functions, that describe fields, similar to ``dataclasses.field()``. 

2881 

2882 At runtime, this decorator records its arguments in the 

2883 ``__dataclass_transform__`` attribute on the decorated object. 

2884 

2885 See PEP 681 for details. 

2886 

2887 """ 

2888 def decorator(cls_or_fn): 

2889 cls_or_fn.__dataclass_transform__ = { 

2890 "eq_default": eq_default, 

2891 "order_default": order_default, 

2892 "kw_only_default": kw_only_default, 

2893 "field_descriptors": field_descriptors, 

2894 } 

2895 return cls_or_fn 

2896 return decorator 

2897 

2898 

2899# We have to do some monkey patching to deal with the dual nature of 

2900# Unpack/TypeVarTuple: 

2901# - We want Unpack to be a kind of TypeVar so it gets accepted in 

2902# Generic[Unpack[Ts]] 

2903# - We want it to *not* be treated as a TypeVar for the purposes of 

2904# counting generic parameters, so that when we subscript a generic, 

2905# the runtime doesn't try to substitute the Unpack with the subscripted type. 

2906if not hasattr(typing, "TypeVarTuple"): 

2907 typing._collect_type_vars = _collect_type_vars 

2908 typing._check_generic = _check_generic