• Пишу бота для телеграм (telebot), проблема с асинхронными функциями. В чем причина ошибки?

    Vindicar
    @Vindicar
    RTFM!
    1. await так не пишется.
    x = await asyncio.create_task(startq(message))
    2. Зачем ты делаешь await?
    asyncio.create_task() создаёт корутину, которая будет выполняться конкуррентно с текущей (как бы параллельно)
    await приостанавливает выполнение текущей корутины, пока не завершится вызываемая (справа от await).
    Т.е. await create_task(...) - это не очень осмысленно: сначала запускаешь параллельную корутину, а потом всё равно стоишь и ждёшь её.
    Если тебе нужно запустить корутину startq() и дождаться её выполнения (ну и получить возвращаемое значение) - пиши просто x = await startq(message)
    Если тебе нужно запустить корутину startq() и пусть она дальше выполняется сама по себе, тебе от неё ничего не надо - достаточно будет asyncio.create_task(startq(message))
    Ответ написан
    1 комментарий
  • Как создать свой PL?

    Vindicar
    @Vindicar
    RTFM!
    Даже для простого ЯП тебе придётся решить минимум четыре задачи:
    1. Лексический анализ. Входной текст нужно превратить в цепочку токенов, например z = x + y превратится в что-то типа
    [ (token.IDENTIFIER, 'z'), (token.OPERATOR, '=') (token.IDENTIFIER, 'x'), (token.OPERATOR, '+') (token.IDENTIFIER, 'y') ]

    2. Синтаксический анализ. Тебе нужно превратить цепочку токенов в древовидную структуру. Корень дерева - программа целиком, промежуточные узлы - элементы программы (функции, составные операторы, сложные выражения и пр.), листья - отдельные элементы сложных выражений и примитивные операции без параметров (типа pass в питоне).
    Например цикл while будет иметь два дочерних узла: выражение-условие и тело цикла.
    3. Области видимости. Тебе нужно иметь возможность сопоставить имя(идентификатор) и сущность (переменную, функцию и т.п.).
    Самый простой способ - позволить узлу дерева описывать идентификаторы, которые известны в этом узле. Тогда при раскрытии идентификатора достаточно подняться вверх по дереву, пока не найдёшь нужное имя.
    4. Выполнение. Так как ты хочешь интерпретируемый язык, то выполнение будет сводиться к обходу дерева в глубину. Некоторые операторы типа break могут вмешиваться в этот порядок. Это описывается паттерном Интерпретатор из набора Банды Четырёх.

    Отдельные задачи в этом списке вполне себе гуглятся, и могут решаться по-разному.
    Ответ написан
    1 комментарий
  • Не сохраняется файл после выполнения кода python, что делать?

    Vindicar
    @Vindicar
    RTFM!
    open('text1.txt', 'w', encoding='utf-8')
    Относительный путь. Файл сохраняется где-то в текущем рабочем каталоге, а не рядом с исходным файлом.
    Судя по тому, что для исходного файла ты указываешь полный путь, у тебя текущий рабочий каталог не на рабочем столе.
    Раз уж используешь pathlib, сконструируй полный путь для целевого файла, типа
    srcpath = Path(file_path)
    if srcpath.is_file() and srcpath.suffix == '.pdf':
        ...
        with (srcpath.parent / 'text1.txt').open('wt', encoding='utf-8') as file:
            ...
    Ответ написан
    2 комментария
  • Что возвращает sql запрос, если поле пустое?

    Vindicar
    @Vindicar
    RTFM!
    HardX, произойдёт то же самое, как при попытке итерироваться по пустому списку.
    Тело цикла просто не выполнится ни разу, и всё.

    empty_list = []
    print('Before')
    for item in empty_list:
        print('Item:', item)
    print('After')
    Ответ написан
  • Почему телеграм бот не запускает?

    Vindicar
    @Vindicar
    RTFM!
    Потому что ты не думаешь, что ты пишешь.
    message.text.lower() == "Привет"
    Ты сравниваешь строку, которая переведена целиком в нижний регистр (т.е. не содержит заглавных букв) со строкой, которая содержит заглавные буквы.
    Ответ написан
    Комментировать
  • Как прервать цикл в ивенте on_message?

    Vindicar
    @Vindicar
    RTFM!
    discord.py?
    on_message() отрабатывает на ВСЕ сообщения, в т.ч. сообщения от самого бота. Проверяй отправителя сообщения.
    И да, этот момент есть в документации discord.py. Советую её почитать.
    Ответ написан
    Комментировать
  • Как правильно задать json файл?

    Vindicar
    @Vindicar
    RTFM!
    Без примера входных данных смысла решать задачу нет. Пинайте тьютора/поддержку Яндекса, пусть дадут пример файла.
    Конечно, можно попробовать хакнуть систему таким образом:
    with open('input.json', 'rt') as src:
        raise ValueError(src.read())

    Если бот яндекса сообщает текст ошибки, может, удастся таким образом выковырять JSON текст целиком, или хотя бы его часть.
    Альтернативно, можно поковырять так:
    with open('input.json', 'rt') as src:
        data = json.load(src)
    raise ValueError(repr(type(data)))  # вернёт скорее всего <type 'list'>. Закомментируешь эту строку и делаешь:
    raise ValueError(repr(data[0]))  # ну и так далее пока не поймешь, что за структуру данных тебе подсовывают.
    Ответ написан
    1 комментарий
  • Как найти экстремальные значения списка (не максимального и минимального значения в списке) а последовательных экстремальных значений макс/мин?

    Vindicar
    @Vindicar
    RTFM!
    Т.е. для каждого максимума нужно найти такой последующий минимум, чтобы разница между максимумом и минимумом была наибольшей, так? И затем нужно найти наибольшую из всех таких разниц, и соответствующие ей элементы?
    Я бы сделал это примерно так. Не уверен, что сработате сразу, но надеюсь что идея передана.
    equity_result1 = [ ... ]  # твои данные - значения эквити во времени
    # определяем индексы таких элементов, которые больше своих соседей слева и справа.
    local_max_idx = [ i for i in range(1, len(equity_result1) - 1) if equity_result1[i-1] < equity_result1[i] and equity_result1[i+1] < equity_result1[i] ]
    # определяем минимумы для интервалов, следующих за соотв. локальным максимумом
    local_min = [ min(equity_result1[i+1:]) for i in local_max_idx ] 
    # определяем индексы этих минимумов в списке equity_result1 
    local_min_idx = [ i+1+equity_result1[i+1:].index(minval) for i, minval in zip(local_max_idx, local_min) ] 
    # собираем сведения о "перепадах" в один список пар индексов (максимум, минимум)
    differences = list(zip(local_max_idx, local_min_idx))
    # ищем наибольший "перепад" по критерию "разность между значением максимума и минимума"
    i_max, i_min = max(differences, key = lambda item: equity_result1[item[0]] - equity_result1[item[1]])
    # интересующий тебя интервал - между i_max и i_min включительно


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

    Vindicar
    @Vindicar
    RTFM!
    В discord.py не слишеом сложные правила разбора строки с командой.
    1. По умолчанию одно слово интерпретируется как один параметр.
    async def command(ctx, a: str, b: str, c:str)
    !command раз два три
    a, b, c == "раз", "два", "три"


    2. Если часть вводимой команды заключена в кавычки, то она интерпретируется как один параметр.
    async def command(ctx, a: str, b: str)
    !command "раз два" три
    a, b == "раз два", "три"


    3. Если последний параметр отмечен как "все позиционные аргументы" (*args), то все последующие слова попадают в него как отдельные элементы.
    async def command(ctx, a: str, *b: str)
    !command раз два три
    a, b == "раз", ("два", "три")


    4. Если последний параметр обозначен как "только ключевое слово" (..., *, param), то остаток строки подаётся в него как есть.
    async def command(ctx, a: str, *, b: str)
    !command раз два три
    a, b == "раз", "два три"


    Таким образом, у тебя есть два выхода.
    а) помещай строку с названием книги в кавычки
    б) поставь название книги последним параметром в своей команде

    EDIT: ниже напомнили, что есть слэш-команды. Посмотри их!
    Ответ написан
    2 комментария
  • Как прописать роль в overwrites?

    Vindicar
    @Vindicar
    RTFM!
    Получи объект роли и укажи его вместо guild.default_role, не?
    Ответ написан
  • Как сравнить местоположение слов в строке python?

    Vindicar
    @Vindicar
    RTFM!
    Любой метод поиска подстроки в строке (хоть str.index(), хоть регулярные выражения) возвращает позицию найденного слова.
    Нашёл позицию одного слова, нашел позицию другого, сравнил два числа.
    Ответ написан
    Комментировать
  • Что тут не так?

    Vindicar
    @Vindicar
    RTFM!
    Потому что в отданном тексте странице не нашёлся элемент form.
    Сохрани req.content в файл и посмотри сам, есть ли он там.
    Ответ написан
    3 комментария
  • Как сделать асинхронный цикл while true?

    Vindicar
    @Vindicar
    RTFM!
    sleep(10)
    Дай угадаю, from time import sleep?
    Если так, то:
    1. Почитай, как работают асинхронные программы
    2. Осознай свой косяк
    3. Замени time.sleep(10) на await asyncio.sleep(10)
    Ответ написан
    Комментировать
  • Как создать соединение через интернет, а не через имитатор локальной сети?

    Vindicar
    @Vindicar
    RTFM!
    В базовом случае у сервера должен быть внешний IP и открыт соответствующий порт.
    Если сервер за подконтрольным NAT (например, роутером), то порт должен быть проброшен через NAT.
    Если сервер за провайдерским NAT (который пользователю неподконтролен), то тут уже сложнее. Есть техники NAT traversal, но они не вполне тривиальны и обычно требуют наличия вспомогательного узла с внешним IP.
    Ответ написан
    Комментировать
  • Как вынести из переменной само название переменной?

    Vindicar
    @Vindicar
    RTFM!
    Никак. Переменная - это просто именованная ссылка на объект.
    И одна переменная не знает про остальные. Можно узнать число ссылок на объект, но их имена в общем случае узнать нельзя. Есть частный случай, показанный EugeneKh, который работает, если ты знаешь пространство имён, где могут лежать искомые ссылки. Но тут вообще впору задаться вопросом "а зачем тебе это?".

    Также есть такая вещь как предварительное выделение (interning) типовых объектов.
    Иными словами:
    >>> a = -100
    >>> b = -100
    >>> a is b
    False
    >>> a = 100
    >>> b = 100
    >>> a is b
    True

    Потому что объекты int для некоторых часто встречающихся чисел выделяются уже при старте питона, и все упоминания этих чисел просто ссылаются на них. И да - это зависит от интерпретатора.
    Так что для примитивных типов такой подход не сработает.
    Ответ написан
    1 комментарий
  • Как добавить к сообщению кнопки в дискорд боте в python?

    Vindicar
    @Vindicar
    RTFM!
    Плохо ищешь. Хотя это только для самой новой версии discord.py (её разработку приостанавливали, но вроде возобновили).
    Пример по ссылке с моими комментариями:
    import discord
    from discord.ext import commands 
    
    client=commands.Bot(command_prefix=".")
    
    class Buttons(discord.ui.View):  # класс описывает набор кнопок
        def __init__(self, *, timeout=180):  # конструктор класса
            super().__init__(timeout=timeout)
        # этому методу будет сопоставлена кнопка. По клику метод будет вызван.
        @discord.ui.button(label="Button",style=discord.ButtonStyle.gray)
        async def gray_button(self,button:discord.ui.Button,interaction:discord.Interaction):
            # ищи сведения об объекте discord.Interaction, чтобы понять, что ещё можно сделать в обработчике кнопки.
            await interaction.response.edit_message(content=f"This is an edited button response!")
            # альтернативно, тут ты можешь вызывать требуемые тебе методы и вообще делать что нужно
    
    @client.command()
    async def button(ctx):  # по команде !button отсылается сообщение с кнопками
        await ctx.send(
            "This message has buttons!",  # текст сообщения как обычно
            view=Buttons()  # создаём экземпляр класса Buttons и прикрепляем его
        )
    
    token=""
    client.run(token)  # запуск бота
    Ответ написан
    Комментировать
  • Как вызвать функцию при нажатии на кнопку в discord?

    Vindicar
    @Vindicar
    RTFM!
    Попробуй такой пример (он для новых версий дискорд.пи):
    import discord
    from discord.ext import commands 
    
    client=commands.Bot(command_prefix=".")
    
    class Buttons(discord.ui.View):  # класс описывает набор кнопок
        def __init__(self, *, timeout=180):  # конструктор класса
            super().__init__(timeout=timeout)
        # этому методу будет сопоставлена кнопка. По клику метод будет вызван.
        @discord.ui.button(label="Button",style=discord.ButtonStyle.gray)
        async def gray_button(self,button:discord.ui.Button,interaction:discord.Interaction):
            # ищи сведения об объекте discord.Interaction, чтобы понять, что ещё можно сделать в обработчике кнопки.
            await interaction.response.edit_message(content=f"This is an edited button response!")
            # альтернативно, тут ты можешь вызывать требуемые тебе методы и вообще делать что нужно
    
    @client.command()
    async def button(ctx):  # по команде !button отсылается сообщение с кнопками
        await ctx.send(
            "This message has buttons!",  # текст сообщения как обычно
            view=Buttons()  # создаём экземпляр класса Buttons и прикрепляем его
        )
    
    token=""
    client.run(token)  # запуск бота
    Ответ написан
    Комментировать
  • Как вычислить ошибку при сериализации json?

    Vindicar
    @Vindicar
    RTFM!
    collection_handle : JSON.stringify(\'["good1...........

    это не JSON, это кусок javascript кода.
    Ответ написан
    Комментировать
  • Как преобразовать число в список из 32 битных целых чисел на Python?

    Vindicar
    @Vindicar
    RTFM!
    Требуется список ID сообщений, которые будут подвергаться какой-то обработке.
    Список из одного элемента - это тоже список.
    Ответ написан
    Комментировать
  • Как сократить/оптимизировать код?

    Vindicar
    @Vindicar
    RTFM!
    1. Вместо mssX сделай список списков.
    field = [ ['_'] * 3, ['_'] * 3, ['_'] * 3 ]
    2. Для хода бота пройдись по полю, составь список координат, куда можно ходить. Потом выбирай рандомом из этого списка.
    3. Проверку победы гораздо проще заменить на цикл. Соберём все элементы вдоль линии (вертикаль, горизонталь, диагональ) и посмотрим сколько разных элементов нашли. Если только 1 элемент, и это НЕ "_", то игрок с этим элементом победил.
    for i in len(field):  # перебираем элементы поля
        values = { field[i][c] for c in len(field[i]) }  # собираем символы i-й строки в _множество_
        if len(values) == 1 and '_' not in values:  # есть строка из одинаковых символов, но не из "_"
            return field[i][0]  # возвращаем символ-победитель
        values = { field[r][i] for r in len(field) }  # собираем символы i-го столбца
        if len(values) == 1 and '_' not in values:  # есть столбец из одинаковых символов, но не из "_"
            return field[0][i]  # возвращаем символ-победитель

    По аналогии сделаешь диагонали.
    Ответ написан
    4 комментария