Задать вопрос
  • Почему выходит None?

    Vindicar
    @Vindicar
    RTFM!
    else print(item + "-NO")
         ^^^^^
    Ответ написан
    Комментировать
  • Как работает переприсваивании значений переменных Phyton?

    Vindicar
    @Vindicar
    RTFM!
    Мы ведь уже присвоили в предыдущем блоке if, что l1 = a.

    А может, и не присвоили. Не факт, что предыдущий if выполнился. Тогда останется l1 от предыдущей итерации цикла. А на первой итерации - будет начальное значение l1 = 0.
    Ответ написан
    Комментировать
  • Как записать Словарь в CSV по СТОЛБЦАМ в Python?

    Vindicar
    @Vindicar
    RTFM!
    Открой для себя функции zip() и itertools.zip_longest().
    Ответ написан
  • Как проверить запущен ли сервер или нет по его IP адресу на Python?

    Vindicar
    @Vindicar
    RTFM!
    Пинг проверяет доступность целевого узла из данного узла.
    Если по какой-то причине нет связности между двумя узлами, или если машина настроена не отвечать на пинг, или какой-то из промежуточных узлов режет ICMP трафик, ты ответа не получишь, даже если сервер будет активен.

    Кроме того, машина может быть активна и отвечать на пинг, но если сервис (программа), которая тебе нужна, не запущена, ты тоже получишь ложный результат.

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

    Vindicar
    @Vindicar
    RTFM!
    Нет. Ты можешь открыть файл на чтение и запись, и затем скакать по файлу с помощью seek(), но это ничуть не быстрее. Меньше дискового пространства требует, вот и вся выгода.
    Текстовые файлы вообще плохо поддаются частичному обновлению.
    Если тебе такое требуется часто, впору смотреть в сторону простых БД, вроде sqlite. Ей не требуется отдельное серверное ПО, и база данных будет состоять из одного файла. Вполне себе нормальный апгрейд.
    Ответ написан
  • Как поменять местами максимальный и минимальный элемент списка?

    Vindicar
    @Vindicar
    RTFM!
    Включи логику.
    Чтобы прочитать/записать элемент списка, нужно знать его индекс.
    Ты знаешь значение минимума/максимума, но не индекс.
    Вывод: нужно в цикле поиска обновления не только само значение minimum и maximum, но и в отдельной паре переменных хранить индекс i, где был обнаружен последний минимум/максимум.

    Любопытно, что ты уже используешь enumerate() для перечисления списка, но до сих пор не использовал индекс очередного элемента i, который он тебе сообщает.
    Ответ написан
  • Можно ли выполнять код при досрочном завершении программы?

    Vindicar
    @Vindicar
    RTFM!
    Зависит от того, что ты понимаешь под досрочным завершением, и что ты хочешь сделать в рамках реакции на это завершение.
    Например, os._exit() прибьёт процесс так, что никакое завершение не отработает. Аналогично, есть другеи ситуации, когда процесс прибивается "снаружи". В таких случаях только мониторинг со стороны родительского процесса, только хардкор.
    В простейшем случае можно завернуть тело программы в try-except, try-finally или кастомный блок with (скажем, через contextlib.contextmanager).
    Также можно посмотреть в сторону модуля atexit, но там свобода действий будет более ограничена.
    Ответ написан
    Комментировать
  • Можно так сделать с interface?

    Vindicar
    @Vindicar
    RTFM!
    Ты хочешь странного. Но ты можешь сделать класс-посредник, который будет дружественным к "владельцу" (основному классу), и будет предоставлять доступ к защищенным методам владельца. А в остальные функции уже передавать этого посредника. Этакий Public Морозов.

    Но лучше еще раз подумать, зачем тебе доступ к защищенному контенту класса вне этого класса. Или доступ не нужен, или контент не должен быть защищённым.
    Ответ написан
    Комментировать
  • Авторизация пользователя в личном скрипте как?

    Vindicar
    @Vindicar
    RTFM!
    Выше тебе уже написали, что единственный способ - не давать код системы пользователю.

    Можешь потыкать модуль pyarmor, но это не панацея, знающий человек его снимет. Это, впрочем, посложнее, чем открыть код программы блокнотом.
    Ответ написан
    Комментировать
  • Почему все говорят что писать ботов это сложно?

    Vindicar
    @Vindicar
    RTFM!
    А сложность начинается, как только задачи, стоящие перед ботом, перерастают уровень примера в документации видеотуториале пятилетней давности.

    Нужно сделать несколько под-команд у команды. Напишу цепочку if-elif-else, делов то. Ой, а теперь простыня кода на пять экранов, в которой фиг чего найдёшь. Потому что нет привычки структурировать код.

    Нужно, чтобы несколько команд/событий формировали цепочку (сценарий). Например, пользователь отправил тре сообщения, первое с именем, второе с возрастом, третье с адресом. Ой, а как это сделать вообще? Не зная понятия "конечный автомат" (finite state machine, FSM), очень трудно догадаться, как тут поступить.

    Нужно, чтобы ботом могли пользоваться несколько человек. Ой, их данные перепутались! Потому что бот использует глобальные переменные.

    Нужно, чтобы бот выполнил длительную задачу, и написал сообщение, когда она выполнится. Не вопрос, напишу функцию, вызову её, а сразу после отправлю сообщение. Ой, а бот не отвечает! Потому что рабочий цикл asyncio занят этой длительной операцией и не может отреагировать на поступающие данные. Нужно иметь хорошее представление о том, как работает асинхронная программа.

    Нужно добавить боту графический интерфейс - админку. Ой, а работает или интерфейс, или сам бот! Потому что нужно представлять, как устроено большинство GUI-фреймворков, и как устроена асинхронное приложение. А заодно понимать многопоточность, вопросы синхронизации действий между двумя потоками, и особенности работы с asyncio в многопоточных приложениях. Потому что одним потоком тут обойтись будет очень непросто.

    Нужно хранить данные в БД. Ой, а почему у меня проблемы при записи в БД имени пользователя? А потому что погромист собирает SQL-запрос через форматирование строк. Надо было почитать доки, чтобы наткнуться на prepared statements, они же parameterized queries.

    Нужно хранить данные в БД. Вот только данные имеют связи многие-ко-многим. Я знаю! Я буду просто добавлять или удалять столбцы в таблицу! Потому что не освоены даже азы проектирования БД. Тут уже nuff said. И да, я такое видел на этом сайте.

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

    Vindicar
    @Vindicar
    RTFM!
    create_tables(), ЕМНИП, делает запрос вида CREATE TABLE IF NOT EXISTS, который проверяет только наличие таблицы, но не её структуру. Или дропни таблицу прямым sql запросом DROP TABLE (с потерей данных!) и пересоздай, или освой schema migration.
    Ответ написан
  • Как в python создать interface?

    Vindicar
    @Vindicar
    RTFM!
    typing.Protocol играет роль интерфейса, с той поправкой, что наследоваться от него потом необязательно - главное, чтобы набор полей/методов соответствовал.

    abc.ABC - это именно абстрактный класс, он требует наследование от себя для соответствия, и часто предполагает наличие какой-то частичной реализации функциональности.

    В отличие от него, typing.Protocol обычно применяется только для описания контракта класса, но не для частичной реализации. Так как он не требует наследования, он хорошо подходит для описания структуры объекты, который мы ожидаем на входе - без жётской привязки этого объекта к нашей иерархии классов.

    "Обычно", потому что и то, и то можно использовать "не по назначению".
    Ответ написан
    9 комментариев
  • TimeoutError: [WinError 10060] Python, куда копать?

    Vindicar
    @Vindicar
    RTFM!
    smpt.yandex.ru?
    Может, всё-таки smtp?
    Ответ написан
    Комментировать
  • При вводе команды в консоли отображается ошибка `NoneType` object is not supscriptable, что делать?

    Vindicar
    @Vindicar
    RTFM!
    f"""**{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]}**"""

    За такое надо калечить.
    Во-первых, это абсолютно нечитаемый кусок кода. Вперемешку вывод пользователю, sql запрос и команды питона.
    Во-вторых, привычка использовать format() для составления SQL запросов приводит к весёлым последствиям, когда требуется подставить строку. Гугл "sql инъекция".
    В-третьих, ты не проверяешь, что вернул тебе fetchone(). С какого перепугу ты решил, что у тебя гарантируется наличие записи с таким id в таблице? Всегда исходи из того, что запрос может потерпеть неудачу, и продумывай, что бот должен делать в таком случае.
    Ответ написан
    Комментировать
  • Как вызывать сторонние функции бота на aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию.
    У start_polling() есть параметр on_startup, который принимает корутину (async-функцию). Эта корутина будет выполнена при старте бота.
    Внутри корутины просто через asyncio.create_task() запускаешь другую корутину, которая уже и будет выполнять периодические обновления.
    И да, вместо велосипеда с datetime посмотри в сторону пакета aioschedule.
    Ответ написан
  • Хочу разместить телеграм бота с бд SQLite3 на selectel, но не могу понять где создать бд и как подключить к боту. Может кто-то знает?

    Vindicar
    @Vindicar
    RTFM!
    sqlite3 сам создаст файл БД, если он не существует. Но вот отсутствующие таблицы в БД должен создать бот, при своём запуске.
    Запрос CREATE TABLE IF NOT EXISTS ... в помощь.
    Ответ написан
    6 комментариев
  • Голосовой ассистент на c#. С чего начать? Что надо изучить? Как реализовать(это мой первый проект)?

    Vindicar
    @Vindicar
    RTFM!
    1. Поищи библиотеки, пригодные для распознавания русской речи и имеющие привязку к C#.
    2. Найди их документацию, там наверняка есть простые примеры работы.
    3. Выбери ту, которая кажется наиболее простой и удобной.
    4. Разбери пример, как обнаружить, записать и распознать фразу.
    5. Продумай, как ты будешь по тексту фразы определять команду. Вопросы, на которые придётся найти ответ:
    - Как отличить разговор от обращения к помощнику (подсказка: "окей, гугл", "алиса", и т.п.)?
    - Как описывать отдельные команды помощника? Как классы, как методы...
    - Как определять, какая команда была произнесена?
    - Как извлекать параметры команды (в простых случаях хватит регулярных выражений, в сложных придётся ещё тащить библиотеки обработки естественных языков типа Natasha)?
    - Могут ли команды перекрываться? Например, если мы сделали команду "таймер", можем ли мы пользоваться ботом, пока таймер не закончится?
    - Как команда будет возвращать результат? Будет ли ей предоставлен какой-то класс/метод от бота, чтобы она могла "сказать" что требуется?
    6. Аналогично разбери библиотеки для синтеза речи.
    Ответ написан
    Комментировать
  • Как перенести данные с Python в Excel?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, python create excel document. Находим xlsxwriter. Эту часть ты сделал.

    Дальше придётся прочитать (а не просто скопипастить) пример и чутка включить голову.
    import xlsxwriter
    
    # Create a workbook and add a worksheet.
    workbook = xlsxwriter.Workbook('Expenses01.xlsx')
    worksheet = workbook.add_worksheet()
    
    # Some data we want to write to the worksheet.
    expenses = (
        ['Rent', 1000],
        ['Gas',   100],
        ['Food',  300],
        ['Gym',    50],
    )
    
    # Start from the first cell. Rows and columns are zero indexed.
    row = 0
    col = 0
    
    # Iterate over the data and write it out row by row.
    for item, cost in (expenses):
        worksheet.write(row, col,     item)
        worksheet.write(row, col + 1, cost)
        row += 1
    
    # Write a total using a formula.
    worksheet.write(row, 0, 'Total')
    worksheet.write(row, 1, '=SUM(B1:B4)')
    
    workbook.close()

    Что мы видим в этом коде? Что метод worksheet.write() принимает в качестве параметров строку и столбец, куда нужно записать значения. Т.е. нам нет необходимости писать их в определённом порядке, мы можем их писать как нам удобнее.
    А чего мы НЕ видим? А мы не видим какого-либо задания лимитов по количеству строк/столбцов. Значит, мы не обязаны знать заранее, сколько строк/столбцов у нас будет в данных, а можем писать по мере поступления новых данных.

    Отсюда вывод: данная библиотека подходит нам до тех пор, пока мы для каждой порции данных можем сказать, в какую ячейку эта порция должна попасть, т.е. можем определить значения row и col. Обрати внимание, что в примере позиция (номер строки) просто хранится переменной и меняется по мере чтения данных, а номер столбца определяется в зависимости от записываемого элемента данных. Этот подход прекрасно подойдёт к описанной задаче, единственная разница - у тебя строки будут зависеть от элемента данных, а столбцы будут наращиваться по мере чтения входных данных.

    В чём сложность адаптировать этот пример к твоей задаче?
    Ответ написан
  • Парсинг сайта Яндекс.Музыка на Python, как?

    Vindicar
    @Vindicar
    RTFM!
    Если сайт не слишком защищается от парсеров и не требует JS для работы:
    requests для скачивания страницы, beautiful soup для разбора html документа и поиска элементов в нём.

    Если сайт требует JS для работы, можно пошариться в консоли разработчика в браузере и найти, какие запросы страница-фронт делает, чтобы подгрузить данные. Тогда ты можешь научиться делать точно такие-же запросы, и получать данные сразу в машинночитаемом виде (часто в JSON).

    Если сайт защищается от парсеров и JS логика слишком сложная, или он часто обновляется, можно попробовать selenium для эмуляции браузера. Дальше используешь инструменты selenium, чтобы найти интересующие тебя элементы на странице.

    Если сайт детектит selenium, нужно искать сборки селениума, которые труднее обнаружить. Тут я навскидку не подскажу.
    Ответ написан
    Комментировать
  • Ошибка: 'NoneType' object has no attribute 'name'?

    Vindicar
    @Vindicar
    RTFM!
    Нужно включить голову и подумать.
    activity у пользователя есть не всегда. Если её нет, поле activity вернёт значение None.
    Перед тем, как обращаться к свойствам activity (например, name), нужно проверить, что оно не None.
    Ответ написан
    Комментировать