Аннотации ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Python

Аннотации ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… β€” ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг развития Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ². БСгодня ΠΌΡ‹ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ расскаТСм, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ· сСбя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

ОблоТка: Аннотации ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Python

Π’Β PythonΒ 3.6 появилась такая интСрСсная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ синтаксис для Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ это Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Β PEP 526. Π‘ΡƒΡ‚ΡŒ этого PEP Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²Β Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти идСю Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² (PEP 484) Π½Π°Β Π΅Ρ‘Β ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒ, Ρ‚.Π΅. ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ поля классов ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π²ΠΎΒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅Β Π΄Π΅Π»Π°Π΅Ρ‚ Python статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ языком. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ всё Ρ€Π°Π²Π½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ ΡƒΠΊΠ°Π·Π°Π½ Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’Π΅ΠΌ Π½Π΅Β ΠΌΠ΅Π½Π΅Π΅ Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Python ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌ инструмСнтС Π²Ρ€ΠΎΠ΄Π΅ pylint ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° функция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, которая сообщит Π²Π°ΠΌ, Ссли Π²Ρ‹ сначала ΡƒΠΊΠ°Π·Π°Π»ΠΈ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² качСствС Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π»Π΅Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ взглянСм на простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

			# annotate.py
name: str = 'Mike'
		

Π’Β Π½Π°ΡˆΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π΅ annotate.py мы создали ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ name ΠΈΒ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ, Π³ΠΎΠ²ΠΎΡ€ΡΡ‰ΡƒΡŽ ΠΎΒ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это строка. ΠΠ½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, поставив Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ послС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΒ Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ вовсС Π½Π΅Β ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ:

			# annotate.py
name: str
		

ΠŸΡ€ΠΈΠΌ.ΠΏΠ΅Ρ€Π΅Π². Π£ΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π² Python 3.5 ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚. ВмСсто этого Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ:

			# annotate.py
name = 'Mike' # type: str
		

ВсС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с аннотациями Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π²Β Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __annotations__ модуля ΠΈΠ»ΠΈ класса. Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ нашСго модуля annotate ΠΈΒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ доступ к этому Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ:

			>>> import annotate
>>> annotate.__annotations__
{'name': <class 'str'>}
>>> annotate.name
'Mike'
		

Как Π²Ρ‹Β Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __annotations__ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с аннотациСй в качСствС значСния. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Ρ‘ нСсколько Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ в наш ΠΌΠΎΠ΄ΡƒΠ»ΡŒ и посмотрим, ΠΊΠ°ΠΊ измСнится Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __annotations__:

			# annotate.py
name: str = 'Mike'

ages: list = [12, 20, 32]

class Car:
    variable: dict
		

В этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹Β Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ список с аннотациСй и класс, содСрТащий ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с аннотациСй. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ нашСго модуля и посмотрим Π½Π°Β Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __annotations__:

			>>> import annotate
>>> annotate.__annotations__
{'name': <class 'str'>, 'ages': <class 'list'>}
>>> annotate.Car.__annotations__
{'variable': <class 'dict'>}
>>> car = annotate.Car()
>>> car.__annotations__
{'variable': <class 'dict'>}
		

В этот Ρ€Π°Π· в словарС находится Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Как Π²Ρ‹Β ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Π²Β Π½Ρ‘ΠΌ Π½Π΅Ρ‚ поля класса. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΒ Π½Π΅ΠΌΡƒ доступ, ΠΌΡ‹Β Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ к классу Car Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр класса ΠΈΒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Β Π·Π½Π°Π΅Ρ‚Π΅ достаточно ΠΎ Ρ‚Π°ΠΊΠΎΠΉ особСнности Python, ΠΊΠ°ΠΊ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Она Π±ΡƒΠ΄Π΅Ρ‚ особСнно ΠΏΠΎΠ»Π΅Π·Π½Π° программистам, ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΡˆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ со статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ языками.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ