ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | ΠΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΏΠΈΡΠΎΠ½Ρ
ΠΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π² CPython ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ. Π Π°Π·Π±ΠΈΡΠ°Π΅ΠΌ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (GIL, Memory), Best Practices (SOLID, DDD) ΠΈ ΡΠΎΠ½ΠΊΠΎΡΡΠΈ Django/FastAPI. Π Π΅ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΏΠΎΠ΄Π²ΠΎΡ ΠΎΠΌ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ. π ΠΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ @evgenycarter Π ΠΠ clck.ru/3Ko7Hq
Show moreπ Analytical overview of Telegram channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | ΠΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΏΠΈΡΠΎΠ½Ρ
Channel ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | ΠΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΏΠΈΡΠΎΠ½Ρ (@bookpython) in the Russian language segment is an active participant. Currently, the community unites 18 126 subscribers, ranking 7 029 in the Technologies & Applications category and 36 294 in the Russia region.
π Audience metrics and dynamics
Since its creation on Π½Π΅Π²ΡΠ΄ΠΎΠΌΠΎ, the project has demonstrated rapid growth, gathering an audience of 18 126 subscribers.
According to the latest data from 26 August, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -69 over the last 30 days and by 1 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 5.49%. Within the first 24 hours after publication, content typically collects 2.59% reactions from the total number of subscribers.
- Post reach: On average, each post receives 995 views. Within the first day, a publication typically gains 469 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 3.
- Thematic interests: Content is focused on key topics such as numbers, yield, ΠΌΠΎΠ΄ΡΠ»Ρ, none, Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ.
π Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
βΠΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π² CPython ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ. Π Π°Π·Π±ΠΈΡΠ°Π΅ΠΌ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (GIL, Memory), Best Practices (SOLID, DDD) ΠΈ ΡΠΎΠ½ΠΊΠΎΡΡΠΈ Django/FastAPI. Π Π΅ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΏΠΎΠ΄Π²ΠΎΡ
ΠΎΠΌ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ. π
ΠΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ @evgenycarter
Π ΠΠ clck.ru/3Ko7Hqβ
Thanks to the high frequency of updates (latest data received on 27 August, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
float Π² Python ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° Π½Π°ΠΏΡΡΠΌΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΠ±ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΉ Π΄ΡΠΎΠ±ΠΈ.
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²Ρ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅ΡΠ΅ Ρ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΡΠΌΠΈ, Π° Π½Π΅ Ρ ΡΠΎΡΠ½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ:
>>> format(0.1, '.17f')
'0.10000000000000001'
ΠΠΎΠ΄ΡΠ»Ρ decimal ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π΅ΡΡΡΠΈΡΠ½ΡΡ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΡΡ:
>>> from decimal import Decimal
>>> Decimal(1) / Decimal(3)
Decimal('0.3333333333333333333333333333')
ΠΠΎ ΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ:
>>> Decimal(1) / Decimal(3) * Decimal(3) == Decimal(1)
False
ΠΠ»Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΠΎΡΠ½ΡΡ
Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ fractions, ΠΊΠΎΡΠΎΡΡΠΉ Ρ
ΡΠ°Π½ΠΈΡ Π»ΡΠ±ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΊΠ°ΠΊ ΡΠ°ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅:
>>> from fractions import Fraction
>>> Fraction(1) / Fraction(3) * Fraction(3) == Fraction(1)
True
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ β Π²ΡΡ ΡΠ°Π²Π½ΠΎ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΈΡΡΠ°ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ
ΡΠΈΡΠ΅Π», ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ Ο.
π² ΠΡ Π² MAX
π@BookPython__new__, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠ°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ __init__ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ __new__ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΌΠ΅ΡΠΎΠ΄ __init__ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½ Π΄ΡΡΠ³ΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ, ΠΈ Π΅Π³ΠΎ __init__ ΡΠΆΠ΅ Π±ΡΠ» Π²ΡΠΏΠΎΠ»Π½Π΅Π½:
class Foo:
def __new__(cls, x):
return dict(x=x)
def __init__(self, x):
print(x) # ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ
print(Foo(0))
ΠΠ°ΠΆΠ½ΠΎ: Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠ»Π°ΡΡΠ° Π² __new__ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° (Foo(...)). ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌΡ Π²ΡΠ·ΠΎΠ²Ρ __init__ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠ΅ΠΊΡΡΡΠΈΠΈ.
ΠΡΠΈΠΌΠ΅Ρ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠ΅ΠΊΡΡΡΠΈΠΈ:
class Foo:
def __new__(cls, x):
return Foo(-x) # Π Π΅ΠΊΡΡΡΠΈΡ
ΠΡΠΈΠΌΠ΅Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° __init__:
class Foo:
def __new__(cls, x):
if x < 0:
return Foo(-x)
return super().__new__(cls)
def __init__(self, x):
print(x)
self._x = x
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±:
class Foo:
def __new__(cls, x):
if x < 0:
return cls.__new__(cls, -x)
return super().__new__(cls)
def __init__(self, x):
print(x)
self._x = x
π² ΠΡ Π² MAX
π@BookPythontyper
Π Π°Π½ΡΡΠ΅ Π΄Π»Ρ CLI-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Python Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» argparse, ΠΏΠΎΡΠΎΠΌ Π±ΡΠ» click, Π½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ» Π½Π° typer. ΠΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡ Π°Π²ΡΠΎΡΠ° FastAPI, ΠΈ ΠΎΠ½Π° ΡΠ΅Π°Π»ΡΠ½ΠΎ π₯
ΠΠΎΡ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
import typer
app = typer.Typer()
@app.command()
def hello(name: str, age: int = 18):
print(f"ΠΡΠΈΠ²Π΅Ρ, {name}! Π’Π΅Π±Π΅ {age} Π»Π΅Ρ.")
if __name__ == "__main__":
app()
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅:
$ python main.py hello Alice --age 30
ΠΡΠΈΠ²Π΅Ρ, Alice! Π’Π΅Π±Π΅ 30 Π»Π΅Ρ.
Π§ΡΠΎ ΠΊΡΡΡΠΎ:
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ --help
- ΠΠΈΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
- ΠΡΡΡ Π°Π²ΡΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ Π² ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ°Ρ
(bash/zsh)
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ ΡΠΈΠΏΠΎΠ² ΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ "ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ"
ΠΡΠ»ΠΈ ΡΡ Π²ΡΡ Π΅ΡΡ ΡΡΡΠ°Π΄Π°Π΅ΡΡ Ρ argparse, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ typer. ΠΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΡ ΡΠΆΠ΅ ΠΊΠ°ΠΉΡΡΠ΅ΡΡ ΠΎΡ FastAPI β ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ
ΠΎΠΆΠΈ.
π² ΠΡ Π² MAX
π@BookPythonNotImplementedError:
def human_name(self):
raise NotImplementedError
Π₯ΠΎΡΡ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ½ ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ IDE (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, PyCharm ΡΡΠΈΡΠ°Π΅Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌΠΈ), Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ: ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΌΠ΅ΡΠΎΠ΄Π°, Π° Π½Π΅ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΊΠ»Π°ΡΡΠ°.
Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ abc:
from abc import ABCMeta, abstractmethod
class Service(metaclass=ABCMeta):
@abstractmethod
def human_name(self):
pass
Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ NotImplemented β ΡΡΠΎ Π½Π΅ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ NotImplementedError. NotImplemented β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ (ΠΊΠ°ΠΊ True ΠΈ False), Π° Π½Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
(__eq__(), __add__() ΠΈ Π΄Ρ.), ΡΡΠΎΠ±Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ Python, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΈ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΡΠ·Π²Π°ΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ a.__add__(b) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ NotImplemented, Python ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ b.__radd__(a)).
π² ΠΡ Π² MAX
π@BookPythonsorted Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΊΠ»ΡΡΠ°:
>>> d = dict(a=1, c=3, b=2)
>>> sorted(d.items(), key=lambda item: item[1])
[('a', 1), ('b', 2), ('c', 3)]
ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π² ΠΌΠΎΠ΄ΡΠ»Π΅ operator:
>>> from operator import itemgetter
>>> sorted(d.items(), key=itemgetter(1))
[('a', 1), ('b', 2), ('c', 3)]
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΡΡΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠ°Ρ ΠΊΠ»ΡΡ-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅:
>>> sorted(d, key=lambda k: d[k])
['a', 'b', 'c']
Π ΡΠ½ΠΎΠ²Π°, ΡΡΡ Π»ΡΠΌΠ±Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ:
>>> sorted(d, key=d.get)
['a', 'b', 'c']
π² ΠΡ Π² MAX
π@BookPythoncontextlib.redirect_stdout, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²ΠΈΡΡ stdout Π² Π»ΡΠ±ΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. Π ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ io.StringIO ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π²ΡΠ²ΠΎΠ΄ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ.
from contextlib import redirect_stdout
from io import StringIO
s = StringIO()
with redirect_stdout(s):
print(42)
print(s.getvalue())
Π’Π°ΠΊΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ contextlib.redirect_stderr Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄Π° sys.stderr.
π² ΠΡ Π² MAX
π@BookPythonlist:
In : lst = [1, 2, 3]
In : lst.pop()
Out: 3
In : lst
Out: [1, 2]
In : lst[:0] = [4] # push
In : lst
Out: [4, 1, 2]
ΠΠ΄Π½Π°ΠΊΠΎ list Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ (Π²Π·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° ΡΡΠΎΡ "push") ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ.
In : lst = [0] * 10_000_000
In : %timeit lst[:0] = [1]
9.5 ms Β± 111 Β΅s per loop (mean Β± std. dev. of 7 runs, 100 loops each)
In : %timeit lst.pop()
84.3 ns Β± 4.01 ns per loop (mean Β± std. dev. of 7 runs, 10000000 loops each)
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ pop() Π² 100 ΡΠ°Π· Π±ΡΡΡΡΠ΅Π΅, ΡΠ΅ΠΌ Π²ΡΡΠ°Π²ΠΊΠ° Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠΏΠΈΡΠΊΠ°. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½ list Π² Python: Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈ ΡΠ΄Π°Π»ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Ρ ΠΊΠΎΠ½ΡΠ°, Π½ΠΎ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅/Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π½Π°ΡΠ°Π»ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°.
ΠΠ»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ collections.deque. ΠΠ½ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½:
In : from collections import deque
In : d = deque([1] * 100_000_000)
In : %timeit d.popleft()
65 ns Β± 0.436 ns per loop (mean Β± std. dev. of 7 runs, 10000000 loops each)
π² ΠΡ Π² MAX
π@BookPythonEnum: ΠΊΠ°ΠΊ Π²ΡΠΆΠ°ΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Enum ΠΊΠ°ΠΊ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ. ΠΠΎ Ρ enum.Enum Π² Python Π΅ΡΡΡ ΠΊΡΠ΄Π° Π±ΠΎΠ»ΡΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ β ΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΠΈΡΠ΅ ΠΈ ΠΌΠΎΡΠ½Π΅Π΅.
ΠΠΎΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΡΠΌΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ°Π»ΠΎ ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ β Π½ΠΎ Π·ΡΡ.
1. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ Π² Enum
from enum import Enum
class Status(Enum):
DRAFT = 'draft'
PUBLISHED = 'published'
ARCHIVED = 'archived'
def is_visible(self):
return self in {Status.DRAFT, Status.PUBLISHED}
Π’Π΅ΠΏΠ΅ΡΡ Status.DRAFT.is_visible() β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΈ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΠΎ.
2. Enum Ρ ΠΏΠΎΠ»ΡΠΌΠΈ
from enum import Enum
class Color(Enum):
RED = ('#FF0000', 'danger')
GREEN = ('#00FF00', 'safe')
def __init__(self, hex_code, label):
self.hex_code = hex_code
self.label = label
Color.RED.hex_code # '#FF0000'
Color.RED.label # 'danger'
3. ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Ρ auto()
from enum import Enum, auto
class Role(Enum):
ADMIN = auto()
USER = auto()
GUEST = auto()
Π£Π΄ΠΎΠ±Π½ΠΎ, Π΅ΡΠ»ΠΈ Π½Π΅ Π²Π°ΠΆΠ½Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π° Π½ΡΠΆΠ½Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅.
4. Π‘ΡΡΠΎΠ³Π°Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ
Π ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
(API, Π±Π°Π·Ρ) Π»ΡΡΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ enum'ΠΎΠ²:
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Enum):
return obj.value
return super().default(obj)
json.dumps(Status.PUBLISHED, cls=CustomEncoder) # "published"
5. Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
Status('draft') == Status.DRAFT # True
Status('draft') is Status.DRAFT # True (enum Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ singleton)
ΠΡΠΎΠ³ΠΎ: Enum β ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ. ΠΡΠΎ Π»ΡΠ³ΠΊΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ Π΄Π°Π½Π½ΡΠ΅, ΡΠ»ΡΡΡΠΈΡΡ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΡΡΠΎΠΉΡΠΈΠ²Π΅Π΅ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ.
π² ΠΡ Π² MAX
π@BookPythonjson ΠΈΠΌΠ΅Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π΄Π»Ρ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ JSON ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ Python. ΠΠΎΠ΄ΡΠ»Ρ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ json.tool ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
$ echo '{"a": [], "b": "c"}' | python -m json.tool
{
"a": [],
"b": "c"
}
π² ΠΡ Π² MAX
π@BookPythondefault_factory Π² dataclass: ΠΌΠΎΡΠ½Π΅Π΅, ΡΠ΅ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ dataclass ΠΊΠ°ΠΊ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°Π΄Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ Ρ ΠΏΠΎΠ»ΡΠΌΠΈ. ΠΠΎ ΡΠ΅Π΄ΠΊΠΎ ΠΊΡΠΎ ΠΏΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ ΡΠ°ΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠΈΠ»Ρ default_factory. Π Π·ΡΡ β ΠΎΠ½ ΡΠΏΠ°ΡΠ°Π΅Ρ ΠΎΡ Π±Π°Π³ΠΎΠ² ΠΈ Π΄Π°ΡΡ Π³ΠΈΠ±ΠΊΠΎΡΡΡ.
ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π·Π°Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»Ρ Π² dataclass, Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΡΠ½ΡΡΡΡΡ ΠΊ default=. ΠΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΡΠΈΠΏ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ»ΠΈ ΡΠ»ΠΎΠ²Π°ΡΡ) β Π²Π°Ρ ΠΏΠΎΠ΄ΠΆΠΈΠ΄Π°Π΅Ρ Π»ΠΎΠ²ΡΡΠΊΠ°.
from dataclasses import dataclass, field
@dataclass
class User:
name: str
tags: list[str] = [] # β οΈ ΠΎΠΏΠ°ΡΠ½ΠΎ!
ΠΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ User Π±ΡΠ΄ΡΡ Π΄Π΅Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΏΠΈΡΠΎΠΊ. Π’ΠΎ Π΅ΡΡΡ:
a = User("Alice")
b = User("Bob")
a.tags.append("admin")
print(b.tags) # ['admin'] π±
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ default_factory:
@dataclass
class User:
name: str
tags: list[str] = field(default_factory=list)
Π’Π΅ΠΏΠ΅ΡΡ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ User Π±ΡΠ΄Π΅Ρ ΡΠ²ΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ:
a = User("Alice")
b = User("Bob")
a.tags.append("admin")
print(b.tags) # []
ΠΠΎ default_factory Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎ ΡΠΏΠΈΡΠΊΠΈ. ΠΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°Π΄Π°ΡΡ Π»ΡΠ±ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ "ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ", Π²ΠΊΠ»ΡΡΠ°Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ:
import uuid
@dataclass
class Session:
id: str = field(default_factory=lambda: str(uuid.uuid4()))
ΠΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ:
import os
@dataclass
class Config:
debug: bool = field(default_factory=lambda: os.getenv("DEBUG") == "1")
ΠΡΡΠ°ΡΠΈ, ΡΡΠΎ Π΅ΡΡ ΠΈ ΠΎΡΠ»ΠΈΡΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ DI:
@dataclass
class Service:
client: "Client" = field(default_factory=create_default_client)
default_factory β ΡΡΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΉ Ρ
Π°ΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠ΄ ΡΠΈΡΠ΅ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½Π΅Π΅, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΡΠ°Π±ΠΎΡΠ°Π΅ΡΡ Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ.
π² ΠΡ Π² MAX
π@BookPythonyield from β ΡΠ»Π΅Π³Π°Π½ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ β Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΏΡΠΎ for x in sub(): yield x. ΠΡΡΡ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠΎΡΠ΅ ΠΈ ΠΌΠΎΡΠ½Π΅Π΅.
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ yield from ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΠΏΠΎΠ΄Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° Π½Π°ΠΏΡΡΠΌΡΡ, Π±Π΅Π· Π»ΠΈΡΠ½Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠΎ ΡΠΈΡΠΊΠ° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎΡΡΠΈ β ΠΎΠ½ ΡΠ°ΠΊΠΆΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΏΠΎΠ΄Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°.
ΠΠΎΡ ΠΊΠ»Π°ΡΡΠΈΠΊΠ°:
def gen():
for x in range(3):
yield x
def wrapper():
for x in gen():
yield x
ΠΠΎΠΆΠ½ΠΎ ΠΊΠΎΡΠΎΡΠ΅ ΠΈ Π»ΡΡΡΠ΅:
def wrapper():
yield from gen()
ΠΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ β yield from ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ return-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠΎΠ΄Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° (Π½Π°ΡΠΈΠ½Π°Ρ Ρ Python 3.3):
def sub():
yield 1
yield 2
return 'done'
def main():
result = yield from sub()
print('Sub returned:', result)
for _ in main():
pass
# ΠΡΠ²Π΅Π΄Π΅Ρ: Sub returned: done
Π Π΅ΡΡ ΡΠ΅ΡΠ΅Π· yield from ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²Π½ΡΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ
:
def delegator():
result = yield from coroutine()
print('coroutine done:', result)
def coroutine():
x = yield
y = yield
return x + y
g = delegator()
next(g) # Π‘ΡΠ°ΡΡ
next(g) # coroutine ΠΆΠ΄Π΅Ρ x
g.send(10) # x = 10
print(g.send(20)) # y = 20 β return 30
# ΠΡΠ²Π΅Π΄Π΅Ρ: coroutine done: 30
ΠΡΠΎΠ³: Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ β ΠΎΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ yield from Π΄Π°ΡΡ Π²Π°ΠΌ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΠΏΡΠΎΠ±ΡΠΎΡ return-Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° Π½ΠΎΠ²ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅.
π² ΠΡ Π² MAX
π@BookPythondatetime. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΎΠ±ΡΠ΅ΠΊΡΡ datetime ΠΈΠΌΠ΅ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ°ΡΠΎΠ²ΡΡ
ΠΏΠΎΡΡΠΎΠ² (Π°ΡΡΠΈΠ±ΡΡ tzinfo), ΠΎΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° `datetime ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π΅Π³ΠΎ Π»ΠΈΡΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ, ΠΎΡΡΠ°Π²Π»ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»ΡΠΌ.
Π‘Π°ΠΌΡΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Π΄Π»Ρ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ pytz. Π₯ΠΈΡΡΠΎΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ pytz Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ tzinfo. Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ pytz ΠΏΡΡΠΌΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π°: Β«ΠΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ API Python Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ tzinfoΒ».
ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·ΠΎΠ½Ρ pytz Π² Π°ΡΡΠΈΠ±ΡΡ tzinfo. ΠΡΠ»ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΡΠ΅, ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π±Π΅Π·ΡΠΌΠ½ΡΠΌ:
In : paris = pytz.timezone('Europe/Paris')
In : str(datetime(2017, 1, 1, tzinfo=paris))
Out: '2017-01-01 00:00:00+00:09'
ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΡΡΠΎΡ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ +00:09. ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ pytz Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
In : str(paris.localize(datetime(2017, 1, 1)))
Out: '2017-01-01 00:00:00+01:00'
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠ»Π΅ Π»ΡΠ±ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ Π΄Π°ΡΠΎΠΉ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ, Π½ΡΠΆΠ½ΠΎ Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ datetime, Π΅ΡΠ»ΠΈ Π΅ΡΡΡ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΡΠΌΠ΅Π½Ρ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° Π³ΡΠ°Π½ΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° Π½Π° Π»Π΅ΡΠ½Π΅Π΅ Π²ΡΠ΅ΠΌΡ):
In : new_time = time + timedelta(days=2)
In : str(new_time)
Out: '2018-03-27 00:00:00+01:00'
In : str(paris.normalize(new_time))
Out: '2018-03-27 01:00:00+02:00'
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Python 3.6, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ dateutil.tz Π²ΠΌΠ΅ΡΡΠΎ pytz. ΠΠ½ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ tzinfo, ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π°ΠΏΡΡΠΌΡΡ, Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ normalize, Ρ
ΠΎΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.
ΠΡΠ»ΠΈ Π²Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΏΠΎΡΠ΅ΠΌΡ pytz Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ API datetime, ΠΈΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ², ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ Ρ
ΠΎΡΠΎΡΡΡ ΡΡΠ°ΡΡΡ Π½Π° ΡΡΡ ΡΠ΅ΠΌΡ.
π² ΠΡ Π² MAX
π@BookPythonmultiprocessing, ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ (pickling). ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅ΡΡΡ, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΈ ΡΠ°ΠΌ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ.
ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΠΏΡΠΎΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Ρ Π»ΡΠ±ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ Π² Π°ΡΡΠΈΠ±ΡΡΠ΅ args. ΠΡΠΈ ΠΆΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΡΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ Π²ΠΎΡΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
ΠΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΠ΅, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ:
import pickle
class TooMuchWeightError(Exception):
def __init__(self, weight):
super().__init__()
self._weight = weight
pickled = pickle.dumps(TooMuchWeightError(42))
pickle.loads(pickled)
ΠΡΠ·ΠΎΠ² TooMuchWeightError.__init__ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π²ΡΠ·ΠΎΠ²Ρ Exception.__init__, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ args ΠΊΠ°ΠΊ ΠΏΡΡΡΠΎΠΉ ΠΊΠΎΡΡΠ΅ΠΆ. ΠΡΠΎΡ ΠΏΡΡΡΠΎΠΉ ΠΊΠΎΡΡΠ΅ΠΆ Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΡΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΡΡΠΎ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΎΡΠΈΠ±ΠΊΠ΅:
TypeError: __init__() missing 1 required positional argument: 'weight'ΠΠ±Ρ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡ
super().__init__() (ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΏΠ»ΠΎΡ
ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ ΠΏΡΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ), Π»ΠΈΠ±ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π²ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΡΠ²Π½ΠΎ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°:
class TooMuchWeightError(Exception):
def __init__(self, weight):
super().__init__(weight)
self._weight = weight
π² ΠΡ Π² MAX
π@BookPythonmap Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄ΡΡΠ³ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°:
In : list(map(lambda x: x ** 2, [1, 2, 3]))
Out: [1, 4, 9]
ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° β ΡΡΠΎ ΠΊΠΎΡΡΠ΅ΠΆ, Π±ΡΠ»ΠΎ Π±Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠΎΡΡΠ΅ΠΆΠ° ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ. Π Python 2 ΡΡΠΎ Π±ΡΠ»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΊΠΎΡΡΠ΅ΠΆΠ° (ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΊΠΎΠ±ΠΊΠΈ):
>>> map(lambda (a, b): a + b, [(1, 2), (3, 4)])
[3, 7]
Π Python 3 ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΡΠ΅Π·Π»Π°, Π½ΠΎ Π΅ΡΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β itertools.starmap. ΠΠ½Π° ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²ΡΠ²Π°Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΆΠΈ Π·Π° Π²Π°Ρ, Π±ΡΠ΄ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠΎ Π·Π²ΡΠ·Π΄ΠΎΡΠΊΠΎΠΉ: f(*arg) (ΠΎΡΡΡΠ΄Π° ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ):
from itertools import starmap
In [3]: list(starmap(lambda a, b: a + b, [(1, 2), (3, 4)]))
Out[3]: [3, 7]
π² ΠΡ Π² MAX
π@BookPythonsuper() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ (Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ) ΠΊΠ»Π°ΡΡΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ΡΠ»ΡΡΠ°ΡΡ
, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Ρ
ΠΎΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΎ-ΡΠΎ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°, Π° Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π΅Π³ΠΎ:
class BaseTestCase(TestCase):
def setUp(self):
self._db = create_db()
class UserTestCase(BaseTestCase):
def setUp(self):
super().setUp()
self._user = create_user()
ΠΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ super Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ "ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ" ΠΈΠ»ΠΈ "ΠΎΡΠ΅Π½Ρ Ρ
ΠΎΡΠΎΡΠΈΠΉ". Π Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ»ΠΎΠ²ΠΎ super ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ "Π²ΡΡΠ΅" (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ»ΠΎΠ²Π΅ superintendent β Π·Π°Π²Π΅Π΄ΡΡΡΠΈΠΉ). ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΡΠΎ, super() Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ β ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ ΠΈ "ΡΠΎΡΠ΅Π΄Π½ΠΈΠΉ" ΠΊΠ»Π°ΡΡ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΡΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π±ΡΠ»Π° Π±Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠ½ΠΊΡΠΈΡ next(), ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΠ΅ΠΏΠΎΡΠΊΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² (MRO β Method Resolution Order).
ΠΡΠΈΠΌΠ΅Ρ:
class Top:
def foo(self):
return 'top'
class Left(Top):
def foo(self):
return super().foo()
class Right(Top):
def foo(self):
return 'right'
class Bottom(Left, Right):
pass
# Π²ΡΠ²ΠΎΠ΄ΠΈΡ 'right'
print(Bottom().foo())
ΠΠ±ΡΠ°ΡΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ super() ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ MRO Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
>>> Bottom().foo()
'right'
>>> Left().foo()
'top'
π² ΠΡ Π² MAX
π@BookPython
$ echo /li*
/lib /lib64
Python ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ globbing Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ glob. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ°ΠΌ ΡΠ°Π±Π»ΠΎΠ½, Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ»Ρ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ, Π° Python β Π½Π΅Ρ:
$ echo /zz**
/zz**
$ python -c 'from glob import glob; print(glob("/zz**"))'
[]
π² ΠΡ Π² MAX
π@BookPythonnext(gen). Π Python 3 Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ g.send(x). ΠΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ΅Ρ
Π½ΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Ρ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π΅Π½Ρ, Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ Π²ΠΎΠ²ΡΠ΅ Π½Π΅ Π·Π½Π°Π΅ΡΠ΅: Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π²Π½ΡΡΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ gen.throw(e) ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΠΉ ΡΠΎΡΠΊΠ΅, Π³Π΄Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ gen ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ β ΡΠΎ Π΅ΡΡΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ yield. ΠΡΠ»ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, gen.throw(e) Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π· yield (ΠΈΠ»ΠΈ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ StopIteration, Π΅ΡΠ»ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π·Π°Π²Π΅ΡΡΡΠ½). ΠΡΠ»ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΊ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΌΡ ΠΊΠΎΠ΄Ρ.
def gen():
try:
yield 1
except ValueError:
yield 2
g = gen()
next(g)
# Out: 1
g.throw(ValueError)
# Out: 2
g.throw(RuntimeError('TEST'))
# RuntimeError: TEST
ΠΡΠ° ΡΠ΅Ρ
Π½ΠΈΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΡΠ½ΠΎ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° β Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π²Π½ΡΡΡΡ, Π½ΠΎ ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°Ρ
ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌΠΈ ΡΠ΅ΡΠ΅Π· yield. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΊΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΈ Π±ΡΠ²Π°ΡΡ ΡΠ΅Π΄ΠΊΠΎ, ΠΈ Π²ΡΡΡΠ΅ΡΠΈΡΡ g.throw Π² Π΄ΠΈΠΊΠΎΠΉ ΠΏΡΠΈΡΠΎΠ΄Π΅ ΠΏΠΎΡΡΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @contextmanager ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ contextlib ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΡΡ ΡΠ΅Ρ
Π½ΠΈΠΊΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΊΠΎΠ΄Ρ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
from contextlib import contextmanager
@contextmanager
def atomic():
print('BEGIN')
try:
yield
except Exception:
print('ROLLBACK')
else:
print('COMMIT')
with atomic():
print('ERROR')
raise RuntimeError()
BEGIN
ERROR
ROLLBACK
π² ΠΡ Π² MAX
π@BookPythonunicodedata:
import unicodedata
modes = [
# Π‘ΠΆΠ°ΡΡ ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠ΅
'NFC',
# Π Π°ΡΡΠΈΡΠΈΡΡ ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠ΅
'NFD',
# Π‘ΠΆΠ°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅
'NFKC',
# Π Π°ΡΡΠΈΡΠΈΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅
'NFKD',
]
s = 'ο¬ + ΓΆ'
for mode in modes:
norm = unicodedata.normalize(mode, s)
print('\t'.join([
mode,
norm,
str(len(norm.encode('utf8'))),
]))
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
NFC ο¬ + ΓΆ 8 NFD ο¬ + ΓΆ 9 NFKC ff + ΓΆ 7 NFKD ff + ΓΆ 8π² ΠΡ Π² MAX π@BookPython
