Ответы пользователя по тегу Python
  • Как создать метаклас в зависимости от env переменной?

    @Zanak
    А зачем метакласс? Чтобы закрепить интерфейс, достаточно породится от абстрактного родительского класса. А для постройки конкретного класса - шаблон "фабрика" вам в помощь.
    Как вариант - можете поиграться с importlib и грузить модули по имени, в стиле а-ля плагин.
    Ответ написан
    Комментировать
  • Кастомная валидация vs использование Pydantic?

    @Zanak
    Если у вас только один класс, то большой разницы не вижу, руками, или с помощью библиотеки.
    Если у вас возможна потребность в проверке +100500 классов, тогда точно выбор за специальным инструментом, например педантик.
    Ответ написан
    Комментировать
  • McRCON - Выдает ошибку при правильном коде, где проблема?

    @Zanak
    Не может найти имя для открытия соединения. Проверте наличие имени в DNS.
    Ответ написан
    Комментировать
  • Как сделать ожидание сообщения?

    @Zanak
    Если это
    If event.text.lower() == ‘Промокод’:
        ...

    копипаста из вашей попытки решить вопрос, то условие ни когда не сработает.
    По api вконтакте не специалист, но правдоподобный ответ легко гуглится.
    Ответ написан
    Комментировать
  • Стоит ли размещать логику импортов в __init__.py?

    @Zanak
    Основная задача __init__.py - это настройка импорта твоего пакета в основной код. Ты можешь как угодно тусовать модули и пакеты нижнего уровня и скрыть этот факт за отдачей в виде "from your_package import *" с помощью init файла.
    Нет ни чего предосудительного, если в этом файле будует присутствовать код инициализации, но определенную осторожнось соблюдать следует. Например, можно, случайно, получить цикл при импорте модулей. Другой пример, мы используем модели, которые используют соединение с БД, которое открывается позже.
    Опять же, возможно это только мои проблемы, я сходу не могу сказать, сколько раз выполнится код инициализации, если модуль импортируется более более 1 раза, и отработает ли ваша логика, если в одном случае это "from your_module import *", в другом "from your_module import name1, name2", а в третьем "import your_module as ym".
    Ответ написан
    Комментировать
  • Как встроить итератор или генератор в уже написанный парсер python?

    @Zanak
    1. Понять, по каким данным желаем итерировать. Если по разобранным данным, то меняем parse_file/counter чтобы она возвращала результат разбора, если по результатам расчета, то создаем метод/методы, для реализации генератора/итератора.
    2. Все подготовительные операции должны быть сделаны до начала возможных итераций. Как минимум - это открыть файл, как максимум - произвести предварительный расчет.
    3. В случае генератора мы правим counter или result, чтобы она использовала yield current_value для отдачи вызывающей стороне текущего значения (в зависимости от того, что хотим возвращать).
    4. В случае итератора реализуем __iter__ и __next__ методы, первый вернет собственно сам итератор, а второй возвращает текущее значение. За подробностями предлагаю сходить в документацию :)

    Вроде ни чего не забыл. :)
    Ответ написан
    Комментировать
  • Как мне расширить конструктор класса X конструктором класса N?

    @Zanak
    Не очень понял, при каких обстоятельствах возник этот кейс, поэтому вопросы:
    - расширить класс X до класса N разве не означает, что N является потомком X?
    - в методе handler родитель создает инстанс потомка, вы уверены, что это правильно?

    Здесь, на мой взгляд, напрашивается наследование или инкапсуляция.
    Если CmdHandler расширяет Server, то можно использовать наследование, утащив общие методы и данные в родительский класс.
    Если классы предназначены для взаимодействия, и их функционал не пересекается, то, я бы, посмотрел в сторону передачи инстанса обработчика конструктору сервера или отдельному методу регистрации в инстансе.
    Ответ написан
    Комментировать
  • Как умножить каждый элемент списка на разные числа?

    @Zanak
    zip забыли :)

    l1 = [1, 2, 3, 4, 5, 6, 7]
    l2 = [5, 4, 8, 3, 7, 8, 9]
    l3 = [l * r for (l, r) in zip(l1, l2)]
    print(l3)
    Ответ написан
    Комментировать
  • Как подключить свой UI к FastAPI?

    @Zanak
    Давайте, для начала, поймем ваши цели. Вы хотите создать свой API, пообщаться с существующим, или приделать свой UI для известного API?

    Для создания своего API указанный инструмент, FastAPI, вполне подходит. Не все фреймворки умеют формировать/отдавать swagger спеку, но некоторые это позволяют. Собственно, для создания собственного сервиса и API, по которому он будет отдавать данные, swagger непременным условием не является. Спека для swagger пишется первой, когда у вас есть генератор, который может построить заготовку проекта на нужном вам языке. Во всех остальных случаях, она, или пишется вручную, или формируется по написанному коду, с использованием соответствующих инструментов.

    Пообщаться с существующим API можно, помимо, например, Postman-а и подобных инструментов, с помощью SwaggerUI, который написан на JS и может быть размещен, например, на вашем сервере. Достаточно подсунуть ему спеку интересующего вас сервера и он, в более или менее удобной форме, позволит увидеть доступные вызовы, отправить запрос, получить ответ, ну и прочитать описание каждого вызова, если автор спеки об этом позаботился. Задача swagger - это представить машинно понятное описание api, со всеми используемыми структурами запросов и ответов, чтобы клиентский код сумел его разобрать, отправить запрос, обработать ответ, и возможно, по крайней мере теоретически, сформировать форму, чтобы пользователь мог ввести свои данные, например, для отправки их в БД. Ни для чего больше, как машинно понятное описание API swagger не предназначен.

    Ну и уже должно быть понятно, что SwaggerUI не предназначен для создания собственных клиентов к API. Это скорее интерактивная документация к сервису, который описан в спеке.

    В выборе средств реализации пользовательского UI вы не ограничены ни чем. Мобильное приложение, десктоп, веб с шаблонами a-la django, spa приложение, все к вашим услугам. На реализацию серверной части это ни как не завязано.
    Ответ написан
    Комментировать
  • Почему не работает postgreSQL?

    @Zanak
    Постгри вы установили?
    Обычный порт для постгри - это 5432. Когда pgadmin-у указываете localhost и этот порт соединение происходит? Для пользователя postgres с паролем, указанным при инсталяции, авторизация проходит?
    Добейтесь успешного соединения с помощью psql или pgadmin, потом беритесь за питон. Будет реально быстрее, в смысле понимания, что именно не пошло.
    Ответ написан
    Комментировать
  • Как "заставить" функции выполнятся после условий, если сначала их нужно написать?

    @Zanak
    Если я правильно понял вопрос, то ваша проблема здесь:
    figures = {'1': triangle(point=point, angle=0, length=200), '2': square(point=point, angle=0, length=200),
               '3': pentangle(point, angle=0, length=100), '4': sixangle(point=point, angle=0, length=100)}

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

    @Zanak
    А кодировку своих исходников указываете? Лучше скрипты держать в кодировке utf8, которая является "родной", для 3 ветки питона.
    В заголовок ответа сервера с погодой можно попробовать посмотреть, какую кодировку он указывает, и попробовать перекодировать (но сначала попробуйте просто указать кодировку своих скриптов, иногда хватает этого)?
    Ответ написан
    3 комментария
  • Почему из-за Popen.wait() подпроцесс работает некоректно?

    @Zanak
    1. У вас компилится windows-gui приложение. Попробуйте явно посмотреть в сторону -m параметра для g++ и добавить правильное значение в ваш cmd сценарий. Форточек под рукой нет, подробнее сказать не могу.
    2. Эта функция вроде как запускает вашу команду с указанными параметрами и ждет завершения, разве нет? (Это по поводу ожидания завершения)
    Ответ написан
    Комментировать
  • Как использовать переменную из функции другого файла?

    @Zanak
    > global var
    Это значит, что вы хотите использовать глобальную переменную, но это не объявление переменной как таковой. Вне функции bar вам надо объявить эту переменную, тогда в функции вы сможете ее инициализировать.
    Ответ написан
    Комментировать
  • Почему FLASK render_template может искажать форматирование передаваемого в качестве параметра HTML-файла?

    @Zanak
    Лучше бы увидеть вашу вьюху, потому что странно, в том виде, как вы описываете, проблем быть не должно.
    Вот чего гугл предложил на запрос "python flask render_template plain html": раз, два, три, ну и четыре.
    Ответ написан
    Комментировать
  • Почему Flask часто падает на сервере разработки, production но не выводит ошибок traceback?

    @Zanak
    Первейший совет: воспользуйтесь поиском, в данном случае может помочь поиск по "flask debug on", или подобным критериям.
    Обычно включение отладки и изучение логов помогает.
    Можно попробовать посоветовать мониторить использование памяти. Не уверен на сто процентов, но в одном из проектов у меня процесс по тихому сыпался, когда утыкался в память, и оптимизация по этому поводу помогла решить проблему.
    Если сервер сидит за apache/nginx, загляните в их логи, иногда бывает полезно.
    Более содержательных идей вряд ли смогу предложить, не видя код.
    Ответ написан
  • Зачем в классе-наследнике вызывать инициализацию класса-родителя в Python?

    @Zanak
    Во первых, разве вызов super не должен выглядеть так:
    super(Example, self).__init__()?
    Когда мы переопределяем метод в потомке класса, то мы можем заново реализовать всю работу этого метода, и тогда вызов super не нужен вовсе.
    Если мы хотим только немного изменить поведение метода, то нам остается в подходящем месте встроить вызов метода родителя, сообщив среде исполнения родителя какого типа мы ищем (в вашем случае Example) и ссылку на текущий экземпляр (это self).
    Теперь собственно ответ на ваш вопрос: инициализация класса родителя может быть сложным процессом, потому что свойства предка сами могут быть объектами, которые важно правильно построить и инициализировать, и если вы не готовы делать это сами, в каждом случае, когда создаете нового наследника, то вы можете вызвать super.
    Только вызывайте его правильно. :)
    Ответ написан
    1 комментарий
  • Что означает за странное (namespace)?

    @Zanak
    Подозреваю, что здесь, в пункте 6.4.1 и таится ответ на ваш вопрос.
    Ответ написан
    4 комментария
  • Flask 400 error?

    @Zanak
    jsonify не спасет отца русской демократии? :)
    Ответ написан
    Комментировать
  • Вывод данных в Flask?

    @Zanak
    1. Не очень понял, зачем вы использовали g. Просто для накопления данных в процессе обработки хватило бы и обычной переменной, а для хранения данных между запросами она не применима (Смотрите замечание на этот счет).
    2. Если вы сами ловите исключение, то и обрабатывать его лучше полностью, с указанием шаблона и кода ответа. На вашу проблему это не влияет, но это просто хорошая привычка, не делать ни чего, или доделывать до конца.
    3. Что подразумевает return внутри блока with? Если объявить переменную аккумулятор значений из файлов выше цикла по файлам, и вместо g.data_local ... и return ... написать код отправки прочитанного значения в накопитель, например как здесь, а потом передать содержимое аккумулятора в шаблон, под именем peopls, не получится именно тот эффект, которого вы и добивались?

    Пара мыслей помимо вашего кода:
    Какова дальнейшая судьба файлов, которые вы уже обработали, вы будете их читать опять, при следующей итерации? Если файлы будут добавляться достаточно часто, то каждый следующий запрос будет работать дольше предыдущего. Может стоит еще раз подумать?
    В зависимости от объема файлов и/или их количества, в особо тяжелых случаях, вы можете упереться в лимит времени ответа. Чинится это легко, но помнить об этом стоит.
    Ответ написан
    Комментировать