рдкрд╛рдпрдерди 3.8 рдореЗрдВ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди (рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдлрд╛рдЗрдирд▓, рдЯрд╛рдЗрдкреНрдбрдбрд┐рдХреНрдЯ, рд▓рд┐рдЯрд░рд▓)

рдЖрдЬ рд░рд╛рдд рдкрд╛рдпрдерди 3.8 рдмрд╛рд╣рд░ рдЖрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдорд┐рд▓реАрдВ:


  • рдкреНрд░реЛрдЯреЛрдХреЙрд▓
  • рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╢рдмреНрджрдХреЛрд╢
  • рдЕрдВрддрд┐рдо рд╡рд┐рд╡рд░рдг
  • рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдорд┐рд▓рд╛рди

рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ( рд╢реБрд░реБрдЖрдд , рдирд┐рд░рдВрддрд░рддрд╛ )
рдФрд░ рдЬрдм рд╣рд░ рдХреЛрдИ рд╡рд╛рд▓рд░рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИ, рдореИрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд╡реАрдирддрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ


рдкреНрд░реЛрдЯреЛрдХреЙрд▓


рдЕрдЬрдЧрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣, рд╡рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рдВрд╕реНрдХрд░рдг 3.8 рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
PEP 544 рдХреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


"рдЗрдЯрд░реЗрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдпрд╛ "рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдЬреИрд╕реЗ рд╢рдмреНрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЕрдм рдЖрдк рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЪрд░рдг рдореЗрдВ рдЙрдирдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рдкрд╛рдпрдерди 3.6 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдЯрд╛рдЗрдкрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдорд╛рдирдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SupportsInt (рдЬрд┐рд╕рдореЗрдВ __int__ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ), SupportsBytes ( __bytes__ рдЖрд╡рд╢реНрдпрдХрддрд╛ __bytes__ ), рдФрд░ рдХреБрдЫ рдЕрдиреНрдпред


рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рд╡рд░рдг


рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╣рд┐рдд) рдФрд░ рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрдХреНрд╖рд╛рдПрдВ рдЗрд╕рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред


 from abc import abstractmethod from typing import Protocol, Iterable class SupportsRoar(Protocol): @abstractmethod def roar(self) -> None: raise NotImplementedError class Lion(SupportsRoar): def roar(self) -> None: print("roar") class Tiger: def roar(self) -> None: print("roar") class Cat: def meow(self) -> None: print("meow") def roar_all(bigcats: Iterable[SupportsRoar]) -> None: for t in bigcats: t.roar() roar_all([Lion(), Tiger()]) # ok roar_all([Cat()]) # error: List item 0 has incompatible type "Cat"; expected "SupportsRoar" 

рд╣рдо рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдирдП рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдореВрд▓ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


 class BigCatProtocol(SupportsRoar, Protocol): def purr(self) -> None: print("purr") 

рд╕рд╛рдорд╛рдиреНрдп, рд╕реНрд╡-рдЯрд╛рдЗрдк, рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп


рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдирд┐рдпрдорд┐рдд рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддрд░рд╣, рдЬреЗрдирд░рд┐рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред Protocol рдФрд░ Generic[T, S,...] рдХреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп Generic[T, S,...] рдЖрдк рдмрд╕ Protocol[T, S,...] рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


рдПрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реНрд╡-рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ( PEP 484 рджреЗрдЦреЗрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП


 C = TypeVar('C', bound='Copyable') class Copyable(Protocol): def copy(self: C) -> C: class One: def copy(self) -> 'One': ... 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм Callable рдПрдиреЛрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ __call__ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ


рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ


рдпрджреНрдпрдкрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдХрднреА-рдХрднреА рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрдЧ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдЗрд╕реЗ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП @runtime_checkable рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП isinstance / issubclass рдЪреЗрдХ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдХрдИ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЬреЗрдирд░рд┐рдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ


рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╢рдмреНрджрдХреЛрд╢


рдЖрдорддреМрд░ рдкрд░ рд╕рдВрд░рдЪрд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛ рдХрдХреНрд╖рд╛рдПрдВ ) рдпрд╛ рдирд╛рдорд┐рдд рдЯреНрдпреВрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ json рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
PEP 589 TypedDict рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп TypedDict , рдЬреЛ рдкрд╣рд▓реЗ mypy рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдерд╛


рдбрд┐рдЯреИрдЪреЗрд▓рд╛рд╕ рдпрд╛ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЯреБрдкрд▓реНрд╕ рдХреА рддрд░рд╣, рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдпрд╛ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ:


 class Book(TypedDict): title: str author: str AlsoBook = TypedDict("AlsoBook", {"title": str, "author": str}) # same as Book book: Book = {"title": "Fareneheit 481", "author": "Bradbury"} # ok other_book: Book = {"title": "Highway to Hell", "artist": "AC/DC"} # error: Extra key 'artist' for TypedDict "Book" another_book: Book = {"title": "Fareneheit 481"} # error: Key 'author' missing for TypedDict "Book" 

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╢рдмреНрджрдХреЛрд╢ рд╕рдорд░реНрдерди рд╡рд┐рд░рд╛рд╕рдд:


 class BookWithDesc(Book): desc: str 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рд╢рдмреНрджрдХреЛрд╢ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрдХреНрд╖рд╛ рдмрдирд╛рддреЗ рд╕рдордп total=False рдкрд╛рд╕ рдХрд░рдХреЗ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдмреЙрдХреНрд╕ рдСрдлрд┐рд╕ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреБрдВрдЬрд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ


 class SimpleBook(TypedDict, total=False): title: str author: str simple_book: SimpleBook = {"title": "Fareneheit 481"} # ok 

TypedDict рдХрд╛ рдЙрдкрдпреЛрдЧ TypedDict рдХреА рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ:


  • рдЖрдЗрдВрд╕реНрдЯреАрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЪреЗрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ
  • рдЪрд╛рдмрд┐рдпрд╛рдБ рд╢рд╛рдмреНрджрд┐рдХ рдпрд╛ рдЕрдВрддрд┐рдо рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, .clear рдпрд╛ del рдЬреИрд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдСрдкрд░реЗрд╢рди рдРрд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рд╛рде рдирд┐рд╖рд┐рджреНрдз del ред
рдПрдХ рдХреБрдВрдЬреА рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬреЛ рд╢рд╛рдмреНрджрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдЙрд╕реЗ рднреА рдирд┐рд╖рд┐рджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ


рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗрд╡рд╛рд▓рд╛


рдкреАрдИрдкреА 591 рдХрдИ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрдХ (рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ) рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ


  • рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдкрджрдирд╛рдо рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ:

 from typing import final @final class Childfree: ... class Baby(Childfree): # error: Cannot inherit from final class "Childfree" ... 

  • рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рд╕реЗ рдирд┐рд╖рд┐рджреНрдз рд╡рд┐рдзрд┐ рдХрд╛ рдкрджрдирд╛рдо:

 from typing import final class Base: @final def foo(self) -> None: ... class Derived(Base): def foo(self) -> None: # error: Cannot override final attribute "foo" (previously declared in base class "Base") ... 

  • рдПрдХ рдЪрд░ (рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ред рдХреНрд▓рд╛рд╕ рдлрд╝реАрд▓реНрдб) рдХрд╛ рдкрджрдирд╛рдо, рдЬрд┐рд╕реЗ рдкреБрди: рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 ID: Final[float] = 1 ID = 2 # error: Cannot assign to final name "ID" SOME_STR: Final = "Hello" SOME_STR = "oops" # error: Cannot assign to final name "SOME_STR" letters: Final = ['a', 'b'] letters.append('c') # ok class ImmutablePoint: x: Final[int] y: Final[int] # error: Final name must be initialized with a value def __init__(self) -> None: self.x = 1 # ok ImmutablePoint().x = 2 # error: Cannot assign to final attribute "x" 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рдХреЛрдб self.id: Final = 123 рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ __init__ рд╡рд┐рдзрд┐ рдореЗрдВ


рд╢рд╛рдмреНрджрд┐рдХ


Literal рдкреАрдИрдкреА 586 рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Literal[42] рдЕрд░реНрде рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ 42 рдХреА рдЙрдореНрдореАрдж рд╣реИред
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рди рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдХреА рд╕рдорд╛рдирддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ 0 рдХреА рдЙрдореНрдореАрдж рд╣реИ рддреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред


 def give_me_five(x: Literal[5]) -> None: pass give_me_five(5) # ok give_me_five(5.0) # error: Argument 1 to "give_me_five" has incompatible type "float"; expected "Literal[5]" give_me_five(42) # error: Argument 1 to "give_me_five" has incompatible type "Literal[42]"; expected "Literal[5]" 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдИ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдШ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ (рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕рдВрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред


рднрд╛рд╡ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Literal[1+2] ) рдпрд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, Literal рдХрд╛ рдЙрдкрдпреЛрдЧ open() рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ mode рдорд╛рдиреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ mode ред


рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╣реИрдВрдбрд▓


рдпрджрд┐ рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА (рдЬреИрд╕реЗ рдореЗрд░реЗ ) рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ,
get_origin рдФрд░ get_args рдлрд╝рдВрдХреНрд╢рди рдЕрдм рдЙрдкрд▓рдмреНрдз рд╣реИрдВред


рддреЛ, X[Y, Z,...] рдХреЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП X[Y, Z,...] рдЯрд╛рдЗрдк X рдХреЛ рдореВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ (Y, Z, ...)
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ X collections рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ, рддреЛ рдЗрд╕реЗ рдореВрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


 assert get_origin(Dict[str, int]) is dict assert get_args(Dict[int, str]) == (int, str) assert get_origin(Union[int, str]) is Union assert get_args(Union[int, str]) == (int, str) 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, __parameters__ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдерд╛


рд╕рдВрджрд░реНрдн


Source: https://habr.com/ru/post/hi470774/


All Articles