Python RU
Все для python разработчиков админ - @haarrp @python_job_interview - Python собеседования @ai_machinelearning_big_data - машинное обучение @itchannels_telegram - 🔥лучшие ит-каналы @programming_books_it - it книги @pythonl РКН: clck.ru/3Fmy2j
Show more📈 Analytical overview of Telegram channel Python RU
Channel Python RU (@pro_python_code) in the Russian language segment is an active participant. Currently, the community unites 12 326 subscribers, ranking 10 166 in the Technologies & Applications category and 52 207 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 12 326 subscribers.
According to the latest data from 03 November, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -16 over the last 30 days and by -3 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 7.59%. Within the first 24 hours after publication, content typically collects 3.08% reactions from the total number of subscribers.
- Post reach: On average, each post receives 935 views. Within the first day, a publication typically gains 379 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 5.
- Thematic interests: Content is focused on key topics such as api, docker, github, sql, linux.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Все для python разработчиков
админ - @haarrp
@python_job_interview - Python собеседования
@ai_machinelearning_big_data - машинное обучение
@itchannels_telegram - 🔥лучшие ит-каналы
@programming_books_it - it книги
@pythonl
РКН: clck.ru/3Fmy2j”
Thanks to the high frequency of updates (latest data received on 04 November, 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.
class Abram:
foo = 10
class Barak(Abram):
pass
class Clara(Barak):
pass
print(Abram.foo, Barak.foo, Clara.foo) # 10 10 10
Тут понятно и новичку, что поле foo вроде как "наследуется" классами Barak и Clara у класса Abram. Однако, давайте попробуем его поменять:
Abram.foo = 20
print(Abram.foo, Barak.foo, Clara.foo) # 20 20 20
Barak.foo = 30
print(Abram.foo, Barak.foo, Clara.foo) # 20 30 30
Abram.foo = 40
print(Abram.foo, Barak.foo, Clara.foo) # 40 30 30
Видим, что у класса Barak и Clara значение стало 30, а Abram.foo живет своей жизнью после Barak.foo = 30 и не перестало влиять на прочие классы.
Работает это так. При поиске атрибута класса сначала спрашивается у самого класса, есть ли у него этот атрибут, если да, то он вернется, если нет, то идут к следующему классу, который старше по иерархии наследования (Clara → Barak → Abram → object). Если у него тоже нет, то идут еще дальше, пока не найдут, иначе возникнет исключение AttributeError.
В нашем примере будем рассуждать с конца. Чему равно Clara.foo? Есть ли атрибут foo у Clara? Вообще говоря, его нет, ведь мы ни разу не присваивали ничего к Clara.foo:
>>> 'foo' in Clara.__dict__
False
Предок класса Clara – класс Barak. Как только мы написали Barak.foo = 30 в классе Barak появился свой собственный foo:
>>> Barak.foo = 20
>>> 'foo' in Barak.__dict__
True
А до этого атрибут foo был изначально только у Abram. Если теперь написать Clara.foo = 50, то у каждого из классов будет свой foo.
Clara.foo = 50
print(Abram.foo, Barak.foo, Clara.foo) # 40 30 50
Вывод: как только мы присвоим атрибут, то атрибуты классов-предков перестают на него влиять. Будьте внимательны, ведь такая же логика действует и для методов класса.
@pro_python_codeimport os
def notify_macos(title, text):
os.system("""
osascript -e 'display notification "{}" with title "{}"'
""".format(text, title))
notify_macos("Поздравляю", "Ген супер-человека найден!")
На Linux можно пойти схожим путем, задействуя программу notify-send (если у вас Ubuntu, то она почти наверняка уже установлена):
import subprocess as s
def notify_linux(message, title):
subprocess.Popen(['notify-send', title, message])
return
Разработчики на Windows, и о вас я не забуду. Попробуйте win10toast.
# pip install win10toast
from win10toast import ToastNotifier
toaster = ToastNotifier()
toaster.show_toast("Заголовок",
"Текст",
duration=5)
Есть ли кросс-платформенное решение? Да, это библиотека plyer от создателей Kivy.
# pip install plyer
from plyer import notification
notification.notify(
title='Заголовок',
message='Сообщение',
app_icon=None, # e.g. 'C:\\icon_32x32.ico'
timeout=5, # секунд
)
plyer умеет не только уведомления, но и предоставляет унифицированный интерфейс к всевозможным API декстопных и мобильных ОС.
Однако, plyer потребует установки дополнительного софта или модулей для каждой платформы. Когда вы в первый раз запустите код, не удивляйтесь ошибкам. Например, на macOS мне потребовалось установить Cython и pyobjus. Библиотека plyer сам по себе не вытягивает эти зависимости, поэтому в вашем проекте не забудьте их добавить самостоятельно (например, в requirements.txt)try-except.
Ловим IndexError, если индекс отсутствует в списке, и KeyError, если ключ отсутствует в словаре. Однако, лучше ловить LookupError, который является предком обоих исключений:
>>> issubclass(KeyError, LookupError)
True
>>> issubclass(IndexError, LookupError)
True
Пример:
config = {}
try:
admin = config['db'][0]['admins']['list'][0]
except LookupError:
admin = 'all'
Альтернативно, вы можете сразу обновлять записи словаря (если они не найдены) методом dict.setdefault(key, default). Этот метод проверяет, есть ли ключ в словаре, если его нет, то в словарь добавляется значение по умолчанию, и оно же возвращается. А если ключ был в словаре, то вернется значение по этому ключу. Поэтому такой неуклюжий код:
if 'workers' not in config:
config['workers'] = 8
workers = config['workers']
Может быть переписан как:
workers = config.setdefault('workers', 8)
Заметьте, что повторный вызов с другим default не поменяет уже записанное в первый раз значение:
>>> d = {}
>>> d.setdefault('foo', 10)
10
>>> d.setdefault('foo', 20)
10
Красивого всем кода!