Usage:
regs = [container.registry]+list(container.child_registries)
x = render(regs, type(container))
print(x)
import re | |
class R: | |
def __init__(self, value): | |
self._value = value | |
class MatchRegex(type): | |
def __instancecheck__(cls, obj): |
from dataclasses import dataclass | |
from adaptix import Retort, Chain, loader, dumper | |
@dataclass | |
class A: | |
field: str | |
Usage:
regs = [container.registry]+list(container.child_registries)
x = render(regs, type(container))
print(x)
from collections import defaultdict | |
from dataclasses import dataclass | |
from uuid import uuid4 | |
from dishka.dependency_source.factory import Factory | |
from dishka.entities.key import DependencyKey | |
from dishka.entities.scope import BaseScope | |
from dishka.registry import Registry | |
import hashlib | |
from timeit import timeit | |
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor | |
a = b'1 2 3 4' * 1024 * 1024 * 100 | |
funcs = [ | |
hashlib.sha1, | |
hashlib.sha256, | |
hashlib.sha384, |
<!DOCTYPE html> | |
<html> | |
<head><meta charset="UTF-8"></meta></head> | |
<body> | |
<h2>Хочу объявить о выходе <b>aiogram_dialog</b> <code>2.0.0</code></h2> | |
<p> | |
Разработка заняла полтора года с января 2022, было выпущено более 20 | |
промежуточных версий. | |
Изначально это планировалось как порт версии 1.х на aiogram3, но после |
import asyncio | |
import logging | |
import os | |
from typing import Any | |
from typing import ( | |
Optional, | |
) | |
from aiogram import Bot, Dispatcher, F, Router | |
from aiogram.filters import CommandStart |
Однажды меня попросили провести ревью и рефакторинг одного telegram-бота. Увидев файл размером 2000 строк, рассчитанный только на обработку разных меню я понял, что это требует унификации и общих подходов. Так родилась библиотека aiogram-dialog
.
В этой статье я бы хотел обратить внимание на некоторые проблемы, которые мы встречаем при создании таких меню, предложить варианты их решения. А во второй половине статьи показать как это решается с помощью aiogram-dialog
.
Мы не будем рассматривать архитектуру всего приложения, об этом вы можете прочитать у Фаулера или Мартина. Мы поговорим только про определенную часть UI ботов. Так же это не будет введением в разработку telegram-ботов с нуля. Я предполагаю, что читатель знаком с питоном, ООП и слышал о такой вещи как DRY. В коде примеров я использую aiogram v3.0 и надеюсь, что читатель уже встроенную в библиотеку использовал машину состояний.
from datetime import date | |
from datetime import date | |
from typing import Dict | |
from babel.dates import get_month_names, get_day_names | |
from aiogram_dialog import DialogManager | |
from aiogram_dialog.widgets.kbd import Calendar, CalendarScope | |
from aiogram_dialog.widgets.kbd.calendar_kbd import ( | |
CalendarDaysView, CalendarMonthView, CalendarScopeView, CalendarYearsView, |
from typing import Protocol, TypeVar, Type, Dict, Any | |
ManagedW = TypeVar("ManagedW", covariant=True) | |
class Manageable(Protocol[ManagedW]): | |
def manage(self) -> ManagedW: | |
raise NotImplementedError | |