ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | ΠΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΏΠΈΡΠΎΠ½Ρ
ΠΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π² CPython ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ. Π Π°Π·Π±ΠΈΡΠ°Π΅ΠΌ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (GIL, Memory), Best Practices (SOLID, DDD) ΠΈ ΡΠΎΠ½ΠΊΠΎΡΡΠΈ Django/FastAPI. Π Π΅ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΏΠΎΠ΄Π²ΠΎΡ ΠΎΠΌ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ. π ΠΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ @evgenycarter Π ΠΠ clck.ru/3Ko7Hq
Ko'proq ko'rsatishπ Telegram kanali ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | ΠΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΏΠΈΡΠΎΠ½Ρ analitikasi
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° | ΠΠ½ΠΈΠ³ΠΈ ΠΏΠΎ ΠΏΠΈΡΠΎΠ½Ρ (@bookpython) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 17 973 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 7 274-o'rinni va Rossiya mintaqasida 36 654-o'rinni egallagan.
π Auditoriya koβrsatkichlari va dinamika
Π½Π΅Π²ΡΠ΄ΠΎΠΌΠΎ sanasidan buyon loyiha tez oβsib, 17 973 obunachiga ega boβldi.
28 Oktabr, 2026 dagi oxirgi maβlumotlarga koβra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -96 ga, soβnggi 24 soatda esa -2 ga oβzgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya oβrtacha 5.41% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 2.64% ini tashkil etuvchi reaksiyalarni toβplaydi.
- Post qamrovi: Har bir post oβrtacha 973 marta koβriladi; birinchi sutkada odatda 475 ta koβrish yigβiladi.
- Reaksiyalar va oβzaro taβsir: Auditoriya faol: har bir postga oβrtacha 4 ta reaksiya keladi.
- Tematik yoβnalishlar: Kontent numbers, yield, ΠΌΠΎΠ΄ΡΠ»Ρ, none, Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ kabi asosiy mavzularga jamlangan.
π Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida taβriflaydi:
βΠΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΠ΅ Π² CPython ΠΈ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ. Π Π°Π·Π±ΠΈΡΠ°Π΅ΠΌ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ (GIL, Memory), Best Practices (SOLID, DDD) ΠΈ ΡΠΎΠ½ΠΊΠΎΡΡΠΈ Django/FastAPI. Π Π΅ΡΠ°Π΅ΠΌ Π·Π°Π΄Π°ΡΠΈ Ρ ΠΏΠΎΠ΄Π²ΠΎΡ
ΠΎΠΌ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ. π
ΠΠΎ Π²ΡΠ΅ΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ @evgenycarter
Π ΠΠ clck.ru/3Ko7Hqβ
Yuqori yangilanish chastotasi (oxirgi maβlumot 29 Oktabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli boβlib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim taβsir nuqtasiga aylantirishini koβrsatadi.
IndexError, ΠΈ KeyError, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ LookupError β ΠΈΡ
ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΊΠ°. ΠΡΠΎ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ:
try:
db_host = config['databases'][0]['hosts'][0]
except LookupError:
db_host = 'localhost'
π² ΠΡ Π² MAX
π@BookPython
class A: pass
a = A()
a.x = 1
a.__dict__
# {'x': 1}
ΠΡΠΈ ΠΏΡΡΠΌΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ ΡΡΠΎΠΌΡ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ Π°ΡΡΠΈΠ±ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌΠΈ Python (ΡΠΎ Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΡ
ΡΠ΅ΡΠ΅Π· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ obj.attr Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ):
a.__dict__[' '] = ' '
getattr(a, ' ')
# ' '
ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ Python Ρ
ΡΠ°Π½ΠΈΡΡ Π°ΡΡΠΈΠ±ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ (ΠΊΠ°ΠΊ Ρ ΠΏΡΠΎΡΡΡΡ
ΡΡΡΡΠΊΡΡΡ C) Ρ ΠΏΠΎΠΌΠΎΡΡΡ slots. ΠΡΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΊΠΎΡΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° Π² ΡΠ»ΠΎΠ²Π°ΡΠ΅.
class Point:
__slots__ = ['x', 'y']
ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ slots. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, Π½Π΅Π»ΡΠ·Ρ Π·Π°Π΄Π°Π²Π°ΡΡ Π°ΡΡΠΈΠ±ΡΡΡ, Π½Π΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π² slots. ΠΠΎ-Π²ΡΠΎΡΡΡ
, Π΅ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΡΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Ρ slots, Π΅Π³ΠΎ slots Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠ΅, Π° Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΠΊ Π½ΠΈΠΌ:
class Parent: __slots__ = ['x']
class Child(Parent): __slots__ = ['y']
c = Child()
c.x = 1
c.y = 2
Π-ΡΡΠ΅ΡΡΠΈΡ
, Π½Π΅Π»ΡΠ·Ρ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ°Π·Ρ ΠΎΡ Π΄Π²ΡΡ
ΡΠ°Π·Π½ΡΡ
ΠΊΠ»Π°ΡΡΠΎΠ² Ρ Π½Π΅ΠΏΡΡΡΡΠΌΠΈ slots, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ.
ΠΠΎΠΌΠ½ΠΈ, ΡΡΠΎ slots ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, Π° Π½Π΅ Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π°Π±ΠΎΡΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
π² ΠΡ Π² MAX
π@BookPythonos.path. ΠΠΎΠ΄ΡΠ»Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΡΡΠΎΠΊΠΈ ΠΊΠ°ΠΊ ΠΏΡΡΠΈ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΡΠ΅ΠΉ ΠΈ ΠΏΡΠΎΡΠ΅Π΅:
>>> import os.path
>>> os.path.join('/usr', 'local')
'/usr/local'
>>> os.path.dirname('/var/log')
'/var'
ΠΠ΄Π½Π°ΠΊΠΎ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ Python 3.4, Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½ΠΎΠ²ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ pathlib, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄:
>>> from pathlib import Path
>>> Path('/usr') / Path('local')
PosixPath('/usr/local')
>>> Path('/usr') / 'local'
PosixPath('/usr/local')
>>> Path('/var/log').parent
PosixPath('/var')
>>> Path('/var/log').parent.name
'var'
π² ΠΡ Π² MAX
π@BookPython
>>> def enclose(gen, before='{', after='}'):
... yield before
... for x in gen:
... yield x
... yield after
...
>>> list(enclose(range(5)))
['{', 0, 1, 2, 3, 4, '}']
ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ yield from:
>>> def enclose(gen, before='{', after='}'):
... yield before
... yield from gen
... yield after
yield from Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±ΡΡΡΡΠ΅Π΅, Π½ΠΎ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ, Π²ΠΎΠ·Π²ΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΈ Π΄Π°ΠΆΠ΅ Π²ΡΠ±ΡΠΎΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π²Π½ΡΡΡΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°.
π² ΠΡ Π² MAX
π@BookPythoncollections ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»Π°ΡΡ ChainMap, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ (ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ) ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ½Π½ΠΎΠ΅:
from collections import ChainMap
d = ChainMap(dict(a=1), dict(a=2, b=2))
d['a'] # 1
d['b'] # 2
d['c'] # ...
# KeyError: 'c'
ChainMap ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅:
d = ChainMap(dict(a=1), dict(a=2, b=2))
d['c'] = 3
d
# ChainMap({'a': 1, 'c': 3}, {'a': 2, 'b': 2})
π² ΠΡ Π² MAX
π@BookPython
a = [2, -1, 0, 1, -2]
sorted(a, key=lambda x: x**2)
# [0, -1, 1, 2, -2]
Π€ΡΠ½ΠΊΡΠΈΠΈ max ΠΈ min ΡΠΎΠΆΠ΅ ΡΡΠ°ΡΠ°ΡΡΡΡ Π±ΡΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ sorted.
max ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ sorted(a, reverse=True)[0], Π° min β ΠΊΠ°ΠΊ sorted(a)[0].
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠ±Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ°ΠΌΡΠΉ Π»Π΅Π²ΡΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
max([2, -2], key=lambda x: x**2)
# 2
max([-2, 2], key=lambda x: x**2)
# -2
min([2, -2], key=lambda x: x**2)
# 2
min([-2, 2], key=lambda x: x**2)
# -2
π² ΠΡ Π² MAX
π@BookPythonfor ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ with.
ΠΡΠ΅ ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Ρ:
name: str, age: int = student
for x: int in numbers:
...
with connection() as conn: Connection:
...
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΊΠ°Π·Π°ΡΡ ΡΠΈΠΏ ΡΠ°ΠΊΠΈΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
β ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΈΡ
Π·Π°ΡΠ°Π½Π΅Π΅, Π±Π΅Π· ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
conn: Connection
with connection() as conn:
...
π² ΠΡ Π² MAX
π@BookPython
>>> 2 + 2
4
>>> _
4
ΠΠΎ-Π²ΡΠΎΡΡΡ
, Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ gettext ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ gettext() Π² Π²ΠΈΠ΄Π΅ _(), ΡΡΠΎΠ±Ρ Π½Π΅ Π·Π°Π³ΡΠΎΠΌΠΎΠΆΠ΄Π°ΡΡ ΠΊΠΎΠ΄.
Π-ΡΡΠ΅ΡΡΠΈΡ
, _ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ ΠΈΠΌΡ Π΄Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ°:
>>> log_entry = '10:50:24 14234 GET /api/v1/test'
>>> time, _, method, location = log_entry.split()
π² ΠΡ Π² MAX
π@BookPythonexcept Exception, Π° Π½Π΅ Π³ΠΎΠ»ΡΠΉ except:
try:
foreign()
except Exception:
logging.warn('fail', exc_info=True)
ΠΠΎΠ»ΡΠΉ except ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ΅Π½ except BaseException. Π ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ BaseException ΠΈ Exception Π² ΡΠΎΠΌ, ΡΡΠΎ BaseException Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π»ΠΎΠ²ΠΈΡΡ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, KeyboardInterrupt.
π² ΠΡ Π² MAX
π@BookPython[] ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ __getitem__. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΡ
ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²:
class Cycle:
def __init__(self, lst):
self._lst = lst
def __getitem__(self, index):
return self._lst[index % len(self._lst)]
print(Cycle(['a', 'b', 'c'])[100]) # 'b'
ΠΠ΅ΠΎΠ±ΡΡΠ½ΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° [] Π² Python Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΡΠΎΠ±ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ. ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊ: [2], Π½ΠΎ ΠΈ ΡΠ°ΠΊ: [2:10], [2:10:2], [2::2] ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ [:]. Π‘ΠΌΡΡΠ» ΡΠ°ΠΊΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ β [start:stop:step], Π½ΠΎ Π² Π²Π°ΡΠΈΡ
ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ
Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΊΠ°ΠΊ ΡΠ³ΠΎΠ΄Π½ΠΎ.
Π§ΡΠΎ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² __getitem__ Π² ΡΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
? ΠΠ±ΡΠ΅ΠΊΡΡ slice ΡΠΎΠ·Π΄Π°Π½Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ.
ΠΡΠΈΠΌΠ΅Ρ:
class Inspector:
def __getitem__(self, index):
print(index)
Inspector()[1]
# 1
Inspector()[1:2]
# slice(1, 2, None)
Inspector()[1:2:3]
# slice(1, 2, 3)
Inspector()[:]
# slice(None, None, None)
Inspector()[:, 0, :]
# (slice(None, None, None), 0, slice(None, None, None))
ΠΠ±ΡΠ΅ΠΊΡ slice ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ β ΠΎΠ½ ΠΏΡΠΎΡΡΠΎ Ρ
ΡΠ°Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΡ start, stop ΠΈ step:
s = slice(1, 2, 3)
print(s.start) # 1
print(s.stop) # 2
print(s.step) # 3
π² ΠΡ Π² MAX
π@BookPythonoverride), Π² Π΄ΡΡΠ³ΠΈΡ
β ΡΡΠΎ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ (Π² Java ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @Override). Π Python Π½Π΅Ρ Π½ΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ, Π½ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ (Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @override, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ, Π° ΡΠ»ΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ ΠΊΠΎΠ΄Π°).
ΠΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ°, Π½Π°ΠΏΡΠΎΡΠΈΠ², β ΡΡΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½ΠΎ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΈΠ³Π½Π°ΡΡΡΠ°ΠΌΠΈ. ΠΡΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² ΡΠ°ΠΊΠΈΡ
ΡΠ·ΡΠΊΠ°Ρ
, ΠΊΠ°ΠΊ Java ΠΈ C++, ΠΈ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:
class Foo {
public static void main(String[] args) {
System.out.println(Hello());
}
public static String Hello() {
return Hello("world");
}
public static String Hello(String name) {
return "Hello, " + name;
}
}
Python Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠΎ ΡΠΈΠ³Π½Π°ΡΡΡΠ°ΠΌ, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠΈΠΏΡ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π½ΠΎ ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π³ΡΠΎΠΌΠΎΠ·Π΄ΠΊΠΎ ΠΈ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΊΡΠ°ΡΠΈΠ²ΠΎ:
def quadrilateral_area(*args):
if len(args) == 4:
quadrilateral = Quadrilateral(*args)
elif len(args) == 1:
quadrilateral = args[0]
else:
raise TypeError()
return quadrilateral.area()
ΠΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½Ρ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΡΠΈΠΏΠΎΠ² Π΄Π»Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΌΠΎΠ΄ΡΠ»Ρ typing ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @overload, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
from typing import overload
@overload
def quadrilateral_area(
q: Quadrilateral
) -> float: ...
@overload
def quadrilateral_area(
p1: Point, p2: Point,
p3: Point, p4: Point
) -> float: ...
π² ΠΡ Π² MAX
π@BookPythonprint(), Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ logging, Π½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΈΡΡΡ ΠΊΡΡΡ ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π― ΡΠ°ΠΊ ΡΠΎΠΆΠ΅ Π΄Π΅Π»Π°Π». ΠΠΎ ΠΏΠΎΡΠΎΠΌ Π²ΡΠ²Π΅Π» ΡΠ΅Π±Π΅ ΠΏΡΠΎΡΡΡΡ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΡ ΡΡ
Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠΈΠ΄Π°Ρ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ:
import logging
def setup_logger(name: str) -> logging.Logger:
logger = logging.getLogger(name)
if not logger.hasHandlers():
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - %(name)s - %(message)s'
)
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
logger = setup_logger(__name__)
logger.info("Π‘ΠΊΡΠΈΠΏΡ ΡΡΠ°ΡΡΠΎΠ²Π°Π»")
Π§ΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ:
* Π£Π΄ΠΎΠ±Π½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈ ΡΡΠΎΠ²Π½Ρ Π»ΠΎΠ³Π°
* ΠΠ°ΡΠΈΡΡ ΠΎΡ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π»ΠΎΠ³ΠΎΠ² (Π΅ΡΠ»ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·)
* ΠΠΎΡΠΎΠ²Π½ΠΎΡΡΡ ΠΊ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ (ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ°ΠΉΠ»-Π»ΠΎΠ³Π³Π΅Ρ)
ΠΡΠ»ΠΈ Π²Ρ ΡΡΡΠ°Π»ΠΈ ΠΎΡ print(), ΠΏΡΠΎΡΡΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΠ΅ ΡΠ΅Π±Π΅ ΡΡΠΎΡ ΡΠ½ΠΈΠΏΠΏΠ΅Ρ β ΠΎΠ½ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ Π²Π°ΠΌ Π²ΡΠ΅ΠΌΡ ΠΈ Π½Π΅ΡΠ²Ρ.
ΠΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ Π»ΠΈ Π²Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌ logging, ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ loguru?
π² ΠΡ Π² MAX
π@BookPythonfunctools.partial
ΠΠ°ΠΊ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΊΠΎΠ΄ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ functools.partial.
ΠΠΎΠΏΡΡΡΠΈΠΌ, Ρ Π½Π°Ρ Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ send_email(to, subject, body, is_html=False), ΠΈ ΠΌΡ ΡΠ°ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π΅Ρ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ is_html=True.
ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎ ΡΠ²Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
from functools import partial
send_html_email = partial(send_email, is_html=True)
# Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅:
send_html_email("user@example.com", "ΠΡΠΈΠ²Π΅Ρ", "<b>ΠΠ°ΠΊ Π΄Π΅Π»Π°?</b>")
ΠΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
* Π»ΠΎΠ³Π³Π΅ΡΡ Ρ ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ ΡΡΠΎΠ²Π½Π΅ΠΌ
* ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡΡ Ρ ΠΎΠ±ΡΠΈΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ
* ΠΊΠΎΠΌΠ°Π½Π΄Ρ CLI Ρ ΡΠΈΠΏΠΎΠ²ΡΠΌΠΈ ΡΠ»Π°Π³Π°ΠΌΠΈ
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π²Ρ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π°Π΅ΡΠ΅ ΠΊΠΎΠ΄ ΡΠΈΡΠ°Π΅ΠΌΠ΅Π΅. Π Π΅ΡΡ ΡΡΠΎ ΠΊΡΠ°ΡΠΈΠ²ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π²Π½Π΅Π΄ΡΠΈΡΡ DI Π±Π΅Π· ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ² β ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ partial.
π² ΠΡ Π² MAX
π@BookPythonfloat Π² 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
π@BookPython