Ответы пользователя по тегу Python
  • Как описать Generic класс?

    @ilya_chch Автор вопроса
    эксперименты показали, что, как вариант, наследников можно описывать так:

    class Service1(BaseService[ServicePayload, None]):
        payload_class = ServicePayload
        payload: ServicePayload
    
        def do_something(self) -> None:
            print(self.payload.some_string)  # например
    
    class Service2(BaseService[None, ServiceParams]):
        params_class = ServiceParams
        params: ServiceParams
    
        def do_something(self) -> None:
            print(self.params.some_int)  # например
    
    class Service3(BaseService[ServicePayload, ServiceParams]):
        payload_class = ServicePayload
        payload: ServicePayload
        params_class = ServiceParams
        params: ServiceParams
    
        def do_something(self) -> None:
            print(self.payload.some_string)  # например
            print(self.params.some_int)  # например


    но, возможно, есть более "правильный" это сделать?
    Ответ написан
    Комментировать
  • Как умножить число на проценты Python?

    @ilya_chch
    учитывая комментарий Сергей К, при условии, что надо указать сколько денег попросит разом:
    educational_grant = float(input("Введите месячную стипендию: ")) # месячная стипуха
    expenses = float(input("Введите месячный расход: ")) # расходы в месяц
    i = 0
    delta = 0
    while i < 9:
        delta += educational_grant - (expenses + (expenses) * 0.03 * i)  # на первой итерации при i = 0, повышения цен аффектит значение
        i += 1
    if delta < 0:
        print(f'нужно просить {-delta} на учебный год')
    else:
        print('денег просить не надо, может еще и останется')
    Ответ написан
    Комментировать
  • Как аннотировать тип классового атрибута, который будет переопределен?

    @ilya_chch Автор вопроса
    Решение нашлось:
    import abc
    from typing import ClassVar, Type, Dict, Generic, TypeVar
    from pydantic import BaseModel
    
    T = TypeVar('T', bound=BaseModel)
    
    
    class Abstract(abc.ABC, Generic[T]):
        context_class: ClassVar[Type[T]]
        error: ClassVar[Type[Exception]]
    
        def __init__(self, data: Dict) -> None:
            self.context = self.context_class(**data)
    
        @abc.abstractmethod
        def process(self) -> None:
            pass
    
    
    class Context(BaseModel):
        email: str
    
    
    class Concrete(Abstract[Context]):
        context_class = Context
    
        def process(self) -> None:
            print(self.context.email)
    Ответ написан
    Комментировать
  • Как организовать проект таким образом чтобы при разработке модулей для него не требовался сам проект?

    @ilya_chch
    Вы сами себе противоречите:
    Как организовать проект таким образом чтобы при разработке модулей для него не требовался сам проект?

    Модуль для своей работы дёргает контроллеры из основного проекта.


    Получается, что ваш модуль не сможет работать без проекта. Вообще.

    Мне кажется, что модули вам стоит делать более мелкими, чтобы они решали только какую-то определенную небольшую задачу.

    Посмотрите в сторону того, как устроен механизм Middleware в Django - есть список middleware и запрос последовательно передается в каждый из них, а возвращаемый модифицированный запрос передается в следующий.

    По поводу доступа в базу, тоже хороший пример - Django. При инициализации открывается соединение с базой и кладется в некое хранилище конфигураций, откуда можно его взять модулям и использовать. Так, при обособленной разработке модулей, можно будет подложить свое, но в собранном проекте будет использоваться глобальное, что сократит время на открытие соединения.

    Для того, чтобы выстроить разработку таких модулей - обозначьте четкий интерфейс каждого типа модуля. Например, модули отвечающий за работу с пользователем, получают на вход объект пользователя и отдают тоже объект пользователя, но либо делают что-то по дороге, либо как-то модифицируют его.
    Ответ написан
    Комментировать
  • Почему после двух активных юзеров бот не 'обслуживает' новых?

    @ilya_chch
    Позволю себе предложить вам использовать RQ или что-то подобное для обработки долгоиграющих запросов.
    Ответ написан
    Комментировать
  • Как средствами Python пройти двухшаговую аутентификация на сайте?

    @ilya_chch
    Он не обновляет страницу. Я думаю, стоит использоваться сессию и посмотреть, какие данные он отправляет и когда. И, собственно повторить их. Посмотрите в Network консоли разработчика. Вероятно, там достаточно будет скопировать POST запрос и сохранить где-нибудь токен.
    Ответ написан
    Комментировать
  • Как настроить интерпретатор в pycharm на linux mint?

    @ilya_chch
    в терминале введите:
    $ whereis python
    ну или какой вы хотите использовать...

    в Pycharm укажите руками по нужному пути
    Ответ написан
    Комментировать