• Почему это работает быстрее?

    @PashaWNN
    Для того, чтобы понять, как это работает на низком уровне, можно использовать функцию `dis.dis`

    первый вариант:
    >>> from dis import dis
    >>>
    >>> def fast_string_comparison(brand, product_name):
    ...         product_name = product_name.split()
    ...         exact_match_brand = list(set(brand) & set(product_name))
    ...         if exact_match_brand:
    ...             exclusive_matches_brand = set(brand) ^ set(exact_match_brand)
    ...         else:
    ...             exclusive_matches_brand = brand
    ...         return exact_match_brand, exclusive_matches_brand
    ...
    >>> dis(fast_string_comparison)
      2           0 LOAD_FAST                1 (product_name)
                  2 LOAD_METHOD              0 (split)
                  4 CALL_METHOD              0
                  6 STORE_FAST               1 (product_name)
    
      3           8 LOAD_GLOBAL              1 (list)
                 10 LOAD_GLOBAL              2 (set)
                 12 LOAD_FAST                0 (brand)
                 14 CALL_FUNCTION            1
                 16 LOAD_GLOBAL              2 (set)
                 18 LOAD_FAST                1 (product_name)
                 20 CALL_FUNCTION            1
                 22 BINARY_AND
                 24 CALL_FUNCTION            1
                 26 STORE_FAST               2 (exact_match_brand)
    
      4          28 LOAD_FAST                2 (exact_match_brand)
                 30 POP_JUMP_IF_FALSE       50
    
      5          32 LOAD_GLOBAL              2 (set)
                 34 LOAD_FAST                0 (brand)
                 36 CALL_FUNCTION            1
                 38 LOAD_GLOBAL              2 (set)
                 40 LOAD_FAST                2 (exact_match_brand)
                 42 CALL_FUNCTION            1
                 44 BINARY_XOR
                 46 STORE_FAST               3 (exclusive_matches_brand)
                 48 JUMP_FORWARD             4 (to 54)
    
      7     >>   50 LOAD_FAST                0 (brand)
                 52 STORE_FAST               3 (exclusive_matches_brand)
    
      8     >>   54 LOAD_FAST                2 (exact_match_brand)
                 56 LOAD_FAST                3 (exclusive_matches_brand)
                 58 BUILD_TUPLE              2
                 60 RETURN_VALUE


    Второй:
    >>> from dis import dis
    >>> def fast_string_comparison(brand, product_name):
    ...         product_name = product_name.split()
    ...         exact_match_brand = list(set(brand) & set(product_name))
    ...         if exact_match_brand:
    ...             exclusive_matches_brand = set(brand) ^ set(exact_match_brand)
    ...             return exact_match_brand, exclusive_matches_brand
    ...         else:
    ...             return exact_match_brand, brand
    ...
    >>> dis(fast_string_comparison)
      2           0 LOAD_FAST                1 (product_name)
                  2 LOAD_METHOD              0 (split)
                  4 CALL_METHOD              0
                  6 STORE_FAST               1 (product_name)
    
      3           8 LOAD_GLOBAL              1 (list)
                 10 LOAD_GLOBAL              2 (set)
                 12 LOAD_FAST                0 (brand)
                 14 CALL_FUNCTION            1
                 16 LOAD_GLOBAL              2 (set)
                 18 LOAD_FAST                1 (product_name)
                 20 CALL_FUNCTION            1
                 22 BINARY_AND
                 24 CALL_FUNCTION            1
                 26 STORE_FAST               2 (exact_match_brand)
    
      4          28 LOAD_FAST                2 (exact_match_brand)
                 30 POP_JUMP_IF_FALSE       56
    
      5          32 LOAD_GLOBAL              2 (set)
                 34 LOAD_FAST                0 (brand)
                 36 CALL_FUNCTION            1
                 38 LOAD_GLOBAL              2 (set)
                 40 LOAD_FAST                2 (exact_match_brand)
                 42 CALL_FUNCTION            1
                 44 BINARY_XOR
                 46 STORE_FAST               3 (exclusive_matches_brand)
    
      6          48 LOAD_FAST                2 (exact_match_brand)
                 50 LOAD_FAST                3 (exclusive_matches_brand)
                 52 BUILD_TUPLE              2
                 54 RETURN_VALUE
    
      8     >>   56 LOAD_FAST                2 (exact_match_brand)
                 58 LOAD_FAST                0 (brand)
                 60 BUILD_TUPLE              2
                 62 RETURN_VALUE
                 64 LOAD_CONST               0 (None)
                 66 RETURN_VALUE
    >>>
    Ответ написан
    Комментировать
  • Как грамотно реализовать настройку вида навбара?

    @PashaWNN
    Для редко меняющихся надписей (упомянутое брендирование) могу предложить такой вариант: создать отдельный файл, скажем, strings.py
    SITE_NAME = 'Habr' # захардкожено
    SITE_DESCRIPTION = os.getenv('SITE_DESCRIPTION')  # или можно взять из переменных окружения

    А потом просто импортировать строки во view и передавать их в контекст шаблона
    Ответ написан
  • Переключение контента по языку?

    @PashaWNN
    Две базы данных труднее поддерживать в одинаковом состоянии и такое решение вообще выглядит странно, плюс лишний оверхед в виде двух процессов самих баз данных. Вариант с двумя колонками выглядит правильнее и логичнее. Также возможен вариант, когда колонки, зависящие от языка, выносятся вообще в отдельную таблицу, плюс туда колонка с кодом/идентификатором языка и foreign key на запись в основной таблице. Такой подход немного увеличит сложность запросов к БД, но даст в перспективе возможность более просто добавления большего количества языков.
    Ответ написан
    Комментировать
  • Как правильно изменить поле наследуемой модели на жёстко заданное значение?

    @PashaWNN
    Необходимо заморачиваться, т.к. логика чтения/записи в базу завязана на сами классы Field и так она работать не будет, а скорее всего возникнет ошибка ещё при попытке создания миграций из-за того, что поле модели переопределено на обычную переменную.
    Но лучше заморочиться и подумать над архитектурой, почему вообще она привела к необходимости жестко задавать значения полей для дочерних моделей. Возможно, у базового класса эти колонки не нужны?
    Джанго также поддерживает такую вещь, как абстрактные модели, которые вообще не создают таблиц в базе данных, а только выступают базовыми для других моделей. Скорее всего это то, что вам нужно.
    Ответ написан
    1 комментарий
  • Почему GitHub не отображает активность при коммитах?

    @PashaWNN
    Как вариант, можно создать приватный репозиторий, включить отображение активности в приватных репозиториях и пушить туда что душе угодно.
    spoiler
    Ну или не страдать фигнёй
    Ответ написан
    Комментировать
  • Как сделать платежную систему с залогом?

    @PashaWNN
    Не знаю, как там насчёт других вендоров, но например в Тинькофф банке это работает так:

    1) Делаешь запрос на `https://securepay.tinkoff.ru/v2/Init`
    Деньги замораживаются, со стороны пользователя выглядит как списание
    Потом два варианта
    2.1) `https://securepay.tinkoff.ru/v2/Confirm`
    Подтверждение платежа, деньги зачисляются на счёт фирмы, прозрачно для клиента.
    2.2. `https://securepay.tinkoff.ru/v2/Cancel`
    Происходит отмена платежа, клиенту приходит возврат
    Ответ написан
    Комментировать
  • Проблема с docker compose read-only file system?

    @PashaWNN
    Ну как минимум, вы не приложили докерфайлы.
    А вообще, здесь может быть две причины: неофициальная сборка докера (особенно этой ошибкой страдает сборка из пакетного менеджера snap) или неправильно настроенные права в самих контейнерах.
    Первое лечится переустановкой по инструкции с офсайта, а второе легко проверить, попытавшись запустить контейнер с флагом --priveleged. Если поможет, то дальше копать в докерфайл.
    Ответ написан
    Комментировать
  • Почему не работает загрузка фото через апи вк, если использовать cron?

    @PashaWNN
    Возможно, дело в правах на запись туда, куда должны сохраняться фотографии.
    Ответ написан