Python Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ² Python. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅
ΠΠ²ΡΠΎΡ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ β Magdalena Tomczyk
Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΠ°ΡΡΠΈ Ρ ΠΎΠΏΠΈΡΠ°Π» ΠΎΡΠ½ΠΎΠ²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ ΡΠΈΠΏΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² ΠΎΡΡΠ°Π»ΠΈΡΡ Π½Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Ρ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ β Π²Π°ΠΆΠ½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ, Π²ΠΎ-Π²ΡΠΎΡΡΡ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΡΠ·Π½Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΡ ΡΠΈΠΏΠ°Ρ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅. ΠΠΎ Π½Π°ΡΠ°ΡΡ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΡ Π²Π΅ΡΠ΅ΠΉ
ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅
ΠΠ±ΡΡΠ½ΠΎ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π½. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡΡ:
Π§ΡΠΎΠ±Ρ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠΎΠΊΠΎΠ²ΡΠΉ Π»ΠΈΡΠ°ΡΠ°Π». Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎ.
Π’Π°ΠΊ ΠΆΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΠΊΠ»Π°ΡΡΠ°ΠΌ ΠΈΠ· Π΄ΡΡΠ³ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½): some_variable: ‘somemodule.SomeClass’
ΠΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠ΅ Π²ΡΡΠΈΡΠ»ΠΈΠΌΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡ Π΄Π΅Π»Π°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠΌΠΈ, ΡΡΠΎΠ±Ρ ΡΡΠΈΠ»ΠΈΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΠΎΠ³Π»ΠΈ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ ΠΈΠΌΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ½ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΡΠΈΡΠ»ΠΈΠΌΡΠ΅ ΡΠΈΠΏΡ. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΏΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΡΡ: PEP 484 β Type Hints # Acceptable type hints
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ Π΄Π°ΠΆΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅, ΠΎΠ΄Π½Π°ΠΊΠΎ mypy Π½Π° Π½Π΅Π³ΠΎ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ
UPD: Π Python 4.0 ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ ΡΠΈΠΏΠΎΠ² (PEP 563), ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠΎ ΡΡΡΠΎΠΊΠΎΠ²ΡΠΌΠΈ Π»ΠΈΡΠ΅ΡΠ°Π»Π°ΠΌΠΈ. Ρ Python 3.7 ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ from __future__ import annotations
Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ
ΠΠ»Ρ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ callback) Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Callable[[ArgType1, ArgType2. ], ReturnType]
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ,
ΠΠ° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ.
Generic-ΡΠΈΠΏΡ
ΠΠ½ΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΈΠΏΠ΅, ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΡΠΈΠΊΡΠΈΡΡΡ Π΅Π³ΠΎ ΠΆΠ΅ΡΡΠΊΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠ°Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΠΏΠ°, ΡΡΠΎ ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
Π’Π°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ ΠΊΠ°ΠΊ List ΠΈΠ»ΠΈ Callable, ΠΊΠΎΡΠΎΡΡΠ΅, ΠΌΡ Π²ΠΈΠ΄Π΅Π»ΠΈ ΡΠ°Π½ΡΡΠ΅ ΠΊΠ°ΠΊ ΡΠ°Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΎΠ². ΠΠΎ ΠΊΡΠΎΠΌΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ², Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΈ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊ-ΡΠΈΠΏΡ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ, Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π·Π°Π²Π΅ΡΡΠΈ TypeVar ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠ°, ΠΈ, Π²ΠΎ-Π²ΡΠΎΡΡΡ , Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠ±ΡΡΠ²ΠΈΡΡ generic-ΡΠΈΠΏ:
ΠΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, Π΄Π»Ρ generic-ΡΠΈΠΏΠΎΠ² ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ²ΠΎΠ΄ ΡΠΈΠΏΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°.
Π’Π°ΠΊΠΆΠ΅, ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ TypeVar Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΡΠΈΠΏΡ:
ΠΠ½ΠΎΠ³Π΄Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΈΠΏ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ cast. ΠΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° β ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ, ΡΡΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΡΠΈΠΏ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
Π’Π°ΠΊΠΆΠ΅ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π»Ρ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΎΠ²:
Π Π°Π±ΠΎΡΠ° Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡΠΌΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ°ΠΌΠ½Π΅ΠΉ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ Π² Python
ΠΡΠΌΠ°Ρ, ΠΌΡ Π²ΡΠ΅ ΠΏΠΎΡΠΈΡ ΠΎΠ½ΡΠΊΡ ΡΠΆΠ΅ ΠΏΡΠΈΠ²ΡΠΊΠ°Π΅ΠΌ, ΡΡΠΎ Ρ Python Π΅ΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ²: ΠΈΡ Π·Π°Π²Π΅Π·Π»ΠΈ Π΄Π²Π° ΡΠ΅Π»ΠΈΠ·Π° Π½Π°Π·Π°Π΄ (3.5) Π² Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² (PEP 484), ΠΈ Π² ΠΏΡΠΎΡΠ»ΠΎΠΌ ΡΠ΅Π»ΠΈΠ·Π΅ (3.6) ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ (PEP 526).
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±Π° ΡΡΠΈΡ PEP Π±ΡΠ»ΠΈ Π²Π΄ΠΎΡ Π½ΠΎΠ²Π»Π΅Π½Ρ MyPy, ΡΠ°ΡΡΠΊΠ°ΠΆΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΆΠΈΡΠ΅ΠΉΡΠΊΠΈΠ΅ ΡΠ°Π΄ΠΎΡΡΠΈ ΠΈ ΠΊΠΎΠ³Π½ΠΈΡΠΈΠ²Π½ΡΠ΅ Π΄ΠΈΡΡΠΎΠ½Π°Π½ΡΡ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ΅Π³Π°Π»ΠΈ ΠΌΠ΅Π½Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΡΠ°Π²Π½ΠΎ ΠΊΠ°ΠΊ ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠ΅Π»ΠΎΠΌ.
Disclamer: Ρ Π½Π΅ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Ρ Π²ΠΎΠΏΡΠΎΡ ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΠ»ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈΠΈ Π² Python. ΠΡΠΎΡΡΠΎ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Ρ ΠΎ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ°ΠΌΠ½ΡΡ , Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ-ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅.
ΠΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ (typing.Generic)
ΠΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ, ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ Π΅Π΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΎΠΌ?
ΠΠ°ΡΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, Π° ΠΏΠΎΡΠΎΠΌ Ρ
ΡΠ°Π½ΠΈΡΡ Π΅Π³ΠΎ ΡΠΈΠΏ?
ΠΠ°ΠΊ-ΡΠΎ Π½Π΅ user-friendly.
Π ΡΡΠΎ, Π΅ΡΠ»ΠΈ Ρ
ΠΎΡΠ΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ?
ΠΠΎΡΡΠΎΠΌΡ Ρ Π½Π°ΠΏΠΈΡΠ°Π» ΡΠ΅Π±Π΅ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, ΡΠ΅ΡΠ°ΡΡΠΈΠΉ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, Π½Π°Π΄ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ, Π½ΠΎ ΡΡΡΡ ΠΏΠΎΠ½ΡΡΠ½Π°.
[UPD]: Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ typing ΠΠ²Π°Π½ ΠΠ΅Π²ΠΈΠ½ΡΠΊΠΈΠΉ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ ΠΎΠ±Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΌΠΎΠ³ΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ ΡΠ»ΠΎΠΌΠ°ΡΡΡΡ.
Anyway, you can use whatever way. Maybe __class_getitem__ is even slightly better, at least __class_getitem__ is a documented special method (although its behavior for generics is not).
Π€ΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π°Π»ΠΈΠ°ΡΡ
ΠΠ°, Ρ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠ°ΠΌΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΏΡΠΎΡΡΠΎ:
Π ΠΏΡΠΈΠΌΠ΅ΡΡ, Π΅ΡΠ»ΠΈ ΠΌΡ Π³Π΄Π΅-ΡΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠ°ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΡΠΎ Π΅Π΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΈΠ· ΠΊΠΎΠ²Π°ΡΠΈΠ°Π½ΡΠ½ΠΎΠΉ Π² ΠΊΠΎΠ½ΡΡΠ²Π°ΡΠΈΠ°Π½ΡΠ½ΡΡ:
Π Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, ΠΏΡΠ΅ΡΠ΅Π½Π·ΠΈΠΉ ΠΊ Π»ΠΎΠ³ΠΈΠΊΠ΅ Ρ ΠΌΠ΅Π½Ρ Π½Π΅Ρ, ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ°ΡΡ ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ΅Π· Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊ-Π°Π»ΠΈΠ°ΡΡ:
ΠΠ±ΡΠ°ΡΠ½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ
CΡΡΡΠΊΡΡΡΠ½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ (Stuctural Suptyping)
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΎΡΠΎΠ±ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠΎΠ»ΡΠ·Ρ Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΠ».
ΠΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° Ρ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΡ ΠΊΠΎΠ»-Π²ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π½Π΅ Π³ΠΎΠ²ΠΎΡΡ ΡΠΆΠ΅ ΠΎ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ:
C Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, MyPy, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠΌΠ½ΠΎ, ΠΈ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ ΡΠΈΠΏΠΎΠ²:
ΠΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ²
Π‘ΠΎΠ²ΡΠ΅ΠΌ ΡΠ²Π΅ΠΆΠ°Ρ ΡΠ΅ΠΌΠ°, Ρ.ΠΊ. ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Ρ ΠΏΠΎΠ»Π½ΠΎΠΉ ΡΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡΡ ΠΏΡΠΎΠΏΠ°Π΄Π°Π΅Ρ Π²ΡΠ΅ Π²Π΅ΡΠ΅Π»ΡΠ΅. ΠΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ ΡΠΆΠ΅ Π½Π΅ ΡΠ°Π· Π²ΡΠΏΠ»ΡΠ²Π°Π» Π² Π±Π°Π³-ΡΡΠ΅ΠΊΠΊΠ΅ΡΠ΅ MyPy, Π½ΠΎ ΠΎΠ½ Π΄ΠΎ ΡΠΈΡ
ΠΏΠΎΡ ΠΊΠΎΠ΅-Π³Π΄Π΅ ΡΡΠ³Π°Π΅ΡΡΡ, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅Π»ΠΎ Π²ΡΠΊΠ»ΡΡΠ°ΡΡ.
ΠΠΎΡΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ:
Π’ΠΎ ΠΆΠ΅ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ Π»ΡΠ±ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠ°Π±ΠΊΠ»Π°ΡΡΠΎΠ² Π²ΠΈΠ΄Π°:
ΠΠΎΠ΅-Π³Π΄Π΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ ΡΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π΅Ρ Π°Π»ΠΈ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΠΊΠΎΠ΅-Π³Π΄Π΅ ΠΏΠΎΠΊΠ° ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π½Π° ΠΏΡΠΎΠ΄Π΅. ΠΠΎ ΠΎΠ±ΡΠ΅Π΅ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠ΅ΡΠΎΠ²: ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ.
ΠΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ / ΡΠ°Π±Π»ΠΎΠ½Ρ Π² ΠΏΠΈΡΠΎΠ½Π΅?
ΠΠ°ΠΊ Python ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ / ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°? Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ Ρ ΠΎΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΉ ΡΠ°ΠΉΠ» «BinaryTree.py» ΠΈ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΠ΅ Π΄Π΅ΡΠ΅Π²ΡΡ, Π½ΠΎ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΡΡ .
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Ρ ΠΌΠΎΠ³ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΅ΠΌΡ ΡΠΈΠΏ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Π² Python?
10 ΠΎΡΠ²Π΅ΡΠΎΠ²
Python ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΡΡΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΠΌΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΈΠΏΠΎΠ².
ΠΡΠ»ΠΈ Π²Ρ ΠΈΠ· C ++ ΡΠΎΠ½Π°, Π²Ρ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ, ΠΏΠΎΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΈ / ΠΊΠ»Π°ΡΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π°, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° T (Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ°), Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠΈΠΏ <
ΠΡΠ°ΠΊ, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊ ΠΆΠ΅:
ΠΠ΄Π½Π°ΠΊΠΎ Π²Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΠ΅, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Π½Π΅ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²Π½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΈΠΏΠΎΠ² (ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ), Π²Ρ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ, ΡΡΠΎΠ±Ρ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°Π»ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΠΎΡΠΈΡ ΠΌΡΡΠ»Π΅ΠΉ ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ² Π² Python, Ρ Π½Π°ΡΠ°Π» ΠΈΡΠΊΠ°ΡΡ ΡΠ΅Ρ , Ρ ΠΊΠΎΠ³ΠΎ Π±ΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΈΠ΄Π΅Ρ, Π½ΠΎ Ρ Π½Π΅ ΡΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ. ΠΡΠ°ΠΊ, Π²ΠΎΡ ΠΎΠ½ΠΎ. Π― ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΡΠΎ, ΠΈ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΡΠΎΡΠΎ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½Π°ΡΠΈ ΡΠΈΠΏΡ Π² python.
Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠΈΠΏΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
ΠΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ΅ ΠΈ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ, ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΏ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»Π°ΡΡΠΎΠ², Π½Π°ΡΠ»Π΅Π΄ΡΡΡΠΈΡ List( str ) Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π±ΡΠ΄ΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡΡΡ ΠΎΡ Π΄Π²ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ². Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅ΠΎΠ΄ΠΎΠ»Π΅ΡΡ ΡΡΠΎ, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ dict Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΡΠΌ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΡΠ°Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΊΠ»Π°ΡΡ, Π° Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ. ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ² Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, Π±ΠΎΠ»Π΅Π΅ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠΎΠ² ΠΈ / ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ python Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½, ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΡΠΎΠ΄Π΅Π»Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ, ΡΡΠΎΠ±Ρ Π²Π°Ρ ΠΊΠ»Π°ΡΡ BinaryTree Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π» Ρ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΡΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½ΡΡ .
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π» Ρ Π±Π°Π·ΠΎΠ²ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ , ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΡΡΡΠΎΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ΅Π»ΡΠ΅ ΡΠΈΡΠ»Π°. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π΅ΡΠ½ΡΡΡ ΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π²Π°ΡΠΈΠΌ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΌ BinaryTree. ΠΡΠ»ΠΈ ΡΡΠΎ Π·Π²ΡΡΠΈΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΡΠΆΠ΅Π»ΠΎ, ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΏΡΠΈ ΠΏΡΠΎΡΡΠΎΠΌ Ρ ΡΠ°Π½Π΅Π½ΠΈΠΈ ΡΡΡΠΎΠΊ, ΠΈΠ·Π²ΠΈΠ½ΠΈΡΠ΅, ΡΡΠΎ Π½Π΅ ΡΠΎ, Π² ΡΠ΅ΠΌ Python Ρ ΠΎΡΠΎΡ.
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΆΠ΅Π½Π΅ΡΠΈΠΊΠΈ Π² Python 3.5+. Π‘ΠΌ. PEP-484 ΠΈ ΡΠΈΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΌΠΎΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅, ΡΡΠΎ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π»Π΅Π³ΠΊΠΎ ΠΈ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΄Π»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ Π·Π½Π°ΠΊΠΎΠΌ Ρ Java Generics, Π½ΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΏΡΠΈΠ³ΠΎΠ΄Π΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Python 2 ΠΈΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ Java-ΠΊΠΎΠ΄. ΠΡ Π½Π΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ. ΠΠΎΡ ΡΡΠΎ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ Π·Π° Π½ΠΎΡΡ: https://github.com/FlorianSteenbuck/python-generics Π― Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΡΠ°ΠΊ ΡΡΠΎ Π²Ρ ΡΠ΅ΠΉΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π΅Π³ΠΎ ΡΠ°ΠΊ:
ΠΠ°Π΄Π°ΡΠΈ
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Python Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½, ΡΠΈΠΏΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΡΡΡΠ΅ ΠΏΡΠΈΠ½ΡΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ Ρ ΠΈΠΌΠ΅Ρ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ Π΄Π΅ΡΠ΅Π²Π° ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ Π΄Π²ΡΡ Π²Π΅ΡΠ²Π΅ΠΉ:
Π ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊ:
Π‘ ΡΡΠΈΠΌ Π½ΠΎΠ²ΡΠΌ ΠΌΠ΅ΡΠ°ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π² ΠΎΡΠ²Π΅ΡΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΡΡΠ»Π°ΡΡΡ ΠΊΠ°ΠΊ:
ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΡΡΠ½ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²
Π ΡΡΠ°ΡΡΡΡ, Π±ΡΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠΈΠ»ΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π° python. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°: ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½Π°Ρ
ΠΠ½ Π½Π΅ ΠΏΡΠΎΠ³ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π» Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ Π»Π΅Ρ, Π½ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΠΎΠ±ΡΠ΅Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ.
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π² Python
ΠΠ²ΡΠΎΡΠΈΠ·ΡΠΉΡΠ΅ΡΡ
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π² Python
ΠΠ΅ΡΠ²ΡΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΎ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°Ρ ΡΠΈΠΏΠΎΠ² Π² ΡΠ·ΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Python ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π² Π±Π°Π·Π΅ Python Enhancement Proposals (PEP-483). Π’Π°ΠΊΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ Π½ΡΠΆΠ½Ρ Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π° ΠΈ Π°Π²ΡΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°ΠΌΠΈ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ½ΠΈΠ·ΠΈΡΡ ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ Π±Π°Π³ΠΎΠ² Π² ΠΊΠΎΠ΄Π΅.
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° Python ΠΈ Π΅Π΅ ΡΠΎΠ»Ρ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ-ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅, ΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° Π΄Π»Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΠΈΡ Python-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ².
Π’ΠΈΠΏΠΈΠ·Π°ΡΠΈΡ Π² Python
ΠΠ»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ ΡΠΈΠΏΠΎΠ² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°ΠΌΠΈ ΡΠΈΠΏΡ:
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ ΡΠΈΠΏΠΎΠ² Π² python-ΡΡΠ½ΠΊΡΠΈΠΈ:
Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΡΠΈΠΏΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΡΡΠΎΠΈΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΏΠΎΠ² Π²Ρ ΠΎΠ΄Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², Π½Π° Π²ΡΠΎΡΠΎΠΌ β ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΡΠΎ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Python.
Π’Π°ΠΊΠΆΠ΅ Python ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ²ΠΎΠΈ Generic-ΡΠΈΠΏΡ.
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ TypeVar ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
ΠΠ° ΠΌΠ΅ΡΡΠ΅ KeyType ΠΈΠ»ΠΈ ValueType ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΡΠΈΠΏΡ.
ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ
Π¦Π΅Π»Ρ β ΡΠΊΠ°Π·Π°ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ Π½Π° ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ Π΄Π°Π½Π½ΡΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°. Π ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°Π³ΠΎΠ², ΡΡΠΊΠΎΡΠΈΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ»ΡΡΡΠΈΡΡ Π΅Π³ΠΎ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ.
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΈ ΠΏΡΠΎΡΠ΅:
ΠΠ΄Π½Π°ΠΊΠΎ, Π² ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ°, Π΅ΡΠ»ΠΈ ΠΊΠ»ΡΡ age Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΠΌΠ΅ΡΡ ΡΡΡΠΎΠΊΠΎΠ²ΡΠΉ ΡΠΈΠΏ. ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠΈΠΏΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π½Π΅ΠΌΠ°Π»ΠΎ ΠΌΠ΅ΡΡΠ° Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Pydantic ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π²Π°Π»ΠΈΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠΈΠΏ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π° ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΉ.
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠΎΠ³Π°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Pydantic ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° ΠΊΠΎΠ΄. Π’Π°ΠΊ, ΠΌΡΡΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΡΠΏΠΎΡΠΎΠ±Π½Π° ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΡΠΈΠΏ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΏΠΎΠ½ΡΡΠ΅Π½. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ User ΠΏΠΎΡΠ»Π΅ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» ΡΠΊΠ°Π·Π°Π½ Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ. ΠΡΠΎ Π²Π΅Π΄Π΅Ρ ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΊΡΡΠΏΠ½ΡΠΌ Π±Π°Π³Π°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³Π΄Π° ΠΈΠ·Π±Π΅Π³Π°ΡΡ.
Π’Π°ΠΊΠΆΠ΅ ΡΠ΅ΠΉΡΠ°Ρ Π½Π°Π±ΠΈΡΠ°Π΅Ρ Π±ΠΎΠ»ΡΡΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ FastAPI, ΠΊΠΎΡΠΎΡΡΠΉ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Pydantic, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±ΡΡΡΡΠΎ ΠΏΠΈΡΠ°ΡΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠ΅ΠΉ Π΄Π°Π½Π½ΡΡ .
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ /item Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅Ρ Π²Ρ ΠΎΠ΄ΡΡΠΈΠΉ json ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π΅Π³ΠΎ Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠ°ΠΊ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ.
Π’Π°ΠΊΠΆΠ΅ Π΄Π»Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π±Π°Π³ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ mypy, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΠΈΠΏΠΎΠ². ΠΠ° ΡΡΠ΅Ρ ΡΡΠΎΠ³ΠΎ Π·Π°ΡΠ°ΡΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΡ Π±Π°Π³ΠΎΠ² ΠΈΠ»ΠΈ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΉ ΡΠΈΠΏΠΎΠ² Π² ΡΡΠ½ΠΊΡΠΈΡΡ .
Π ΠΊΠ°ΠΊ Π±ΠΎΠ½ΡΡ Π΄Π»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ Π»Π΅Π½ΠΈΡΡΡ Π²ΡΡΡΠ½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ. MonkeyType Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΈΠΏΡ Π²ΠΎ Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡΡ , Ρ ΠΎΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΉΡΠΈΡΡ ΠΏΠΎ ΠΊΠΎΠ΄Ρ ΠΈ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΊΠ°Π·Π°Π»ΠΈΡΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π½Ρ Π½Π΅ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡ.
ΠΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΡ Python 3.9.0
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΠΏΡ Π² ΡΠ·ΡΠΊΠ΅ Python. Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π² Python ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠ°Π΅ΠΌΡΠΌ ΠΈ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΡΠ΅Π²ΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΈ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ Π³Π»ΡΠΏΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ. Π₯ΠΎΡΠΎΡΠ΅Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ Π±ΡΡΡΡΠ΅Π΅ Π²Π»ΠΈΡΡΡΡ Π² ΠΏΡΠΎΠ΅ΠΊΡ, ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΈ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² Π·Π°Π΄Π°ΡΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΡΠ΄Π°Π΅ΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π½Π΅Π΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΡΠΈΠΏΠΎΠ² ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ.
GenericsΠΒΆ
Defining generic classesΠΒΆ
Programs can also define new generic classes. Here is a very simple generic class that represents a stack:
Using Stack is similar to built-in container types:
Type inference works for user-defined generic types as well:
Construction of instances of generic types is also type checked:
Generic class internalsΠΒΆ
Generic types could be instantiated or subclassed as usual classes, but the above examples illustrate that type variables are erased at runtime. Generic Stack instances are just ordinary Python objects, and they have no extra runtime overhead or magic due to being generic, other than a metaclass that overloads the indexing operator.
Defining sub-classes of generic classesΠΒΆ
User-defined generic classes and generic classes defined in typing can be used as base classes for another classes, both generic and non-generic. For example:
Generic can be omitted from bases if there are other base classes that include type variables, such as Mapping[KT, VT] in the above example. If you include Generic[. ] in bases, then it should list all type variables present in other bases (or more, if needed). The order of type variables is defined by the following rules:
Generic functionsΠΒΆ
Generic type variables can also be used to define generic functions:
As with generic classes, the type variable can be replaced with any type. That means first can be used with any sequence type, and the return type is derived from the sequence item type. For example:
Note also that a single definition of a type variable (such as T above) can be used in multiple generic functions or classes. In this example we use the same type variable in two generic functions:
A variable cannot have a type variable in its type unless the type variable is bound in a containing generic class or function.
Generic methods and generic selfΠΒΆ
You can also define generic methods Π²Πβ just use a type variable in the method signature that is different from class type variables. In particular, self may also be generic, allowing a method to return the most precise type known at the point of access.
This feature is experimental. Checking code with type annotations for self arguments is still not fully implemented. Mypy may disallow valid code or allow unsafe code.
In this way, for example, you can typecheck chaining of setter methods:
Note also that mypy cannot always verify that the implementation of a copy or a deserialization method returns the actual type of self. Therefore you may need to silence mypy inside these methods (but not at the call site), possibly by making use of the Any type.
Variance of generic typesΠΒΆ
Let us illustrate this by few simple examples:
This function needs a callable that can calculate a salary for managers, and if we give it a callable that can calculate a salary for an arbitrary employee, itΠ²Π™s still safe.
List is an invariant generic type. Naively, one would think that it is covariant, but let us consider this code:
Type variables with value restrictionΠΒΆ
By default, a type variable can be replaced with any type. However, sometimes itΠ²Π™s useful to have a type variable that can only have some specific types as its value. A typical example is a type variable that can only have values str and bytes :
This is actually such a common type variable that AnyStr is defined in typing and we donΠ²Π™t need to define it ourselves.
We can use AnyStr to define a function that can concatenate two strings or bytes objects, but it canΠ²Π™t be called with other argument types:
Note that this is different from a union type, since combinations of str and bytes are not accepted:
In this case, this is exactly what we want, since itΠ²Π™s not possible to concatenate a string and a bytes object! The type checker will reject this function:
Another interesting special case is calling concat() with a subtype of str :
Type variables with upper boundsΠΒΆ
In a call to such a function, the type T must be replaced by a type that is a subtype of its upper bound. Continuing the example above,
Type parameters of generic classes may also have upper bounds, which restrict the valid values for the type parameter in the same way.
A type variable may not have both a value restriction (see Type variables with value restriction ) and an upper bound.
Declaring decoratorsΠΒΆ
One common application of type variable upper bounds is in declaring a decorator that preserves the signature of the function it decorates, regardless of that signature.
Note that class decorators are handled differently than function decorators in mypy: decorating a class does not erase its type, even if the decorator has incomplete type annotations.
HereΠ²Π™s a complete example of a function decorator:
From the final block we see that the signatures of the decorated functions foo() and bar() are the same as those of the original functions (before the decorator is applied).
The bound on F is used so that calling the decorator on a non-function (e.g. my_decorator(1) ) will be rejected.
Decorator factoriesΠΒΆ
Functions that take arguments and return a decorator (also called second-order decorators), are similarly supported via generics:
Sometimes the same decorator supports both bare calls and calls with arguments. This can be achieved by combining with @overload :
Generic protocolsΠΒΆ
The main difference between generic protocols and ordinary generic classes is that mypy checks that the declared variances of generic type variables in a protocol match how they are used in the protocol definition. The protocol in this example is rejected, since the type variable T is used covariantly as a return type, but the type variable is invariant:
This example correctly uses a covariant type variable:
See Variance of generic types for more about variance.
Generic protocols can also be recursive. Example:
Generic type aliasesΠΒΆ
Type aliases can be imported from modules just like other names. An alias can also target another alias, although building complex chains of aliases is not recommended Π²Πβ this impedes code readability, thus defeating the purpose of using aliases. Example:
A type alias does not define a new type. For generic type aliases this means that variance of type variables used for alias definition does not apply to aliases. A parameterized generic alias is treated simply as an original type with the corresponding type variables substituted.