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

    drygdryg
    @drygdryg
    Python-разработчик
    Поскольку самая популярная и эталонная реализация Python: CPython имеет открытый исходный код, вы можете найти исходники встроенных функций в репозитории с исходными кодами CPython: https://github.com/python/cpython.
    Некоторые встроенные функции написаны не на Python, а на том языке, на котором написан сам интерпретатор Python: на Си, поэтому, скорее всего, там вы не найдёте легкочитаемый исходный код функций sum, min, max и др.
    Но в случае, когда функция или любой другой объект написан на Python, посмотреть его исходный код можно с помощью inspect.getsource:
    >>> import inspect
    >>> import requests
    >>> print(inspect.getsource(requests.get))
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
            in the query string for the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        return request("get", url, params=params, **kwargs)

    Получить исходный код встроенной функции или метода, реализованного на Си внутри CPython, таким способом не получится:
    Попытка получить исходный код функции sum

    >>> import inspect
    >>> print(inspect.getsource(sum))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.10/inspect.py", line 1139, in getsource
        lines, lnum = getsourcelines(object)
      File "/usr/lib/python3.10/inspect.py", line 1121, in getsourcelines
        lines, lnum = findsource(object)
      File "/usr/lib/python3.10/inspect.py", line 940, in findsource
        file = getsourcefile(object)
      File "/usr/lib/python3.10/inspect.py", line 817, in getsourcefile
        filename = getfile(object)
      File "/usr/lib/python3.10/inspect.py", line 797, in getfile
        raise TypeError('module, class, method, function, traceback, frame, or '
    TypeError: module, class, method, function, traceback, frame, or code object was expected, got builtin_function_or_method


    Также можно использовать IPython для получения того же результата более коротким путём:
    In [1]: import requests
    
    In [2]: %psource requests.get
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
            in the query string for the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        return request("get", url, params=params, **kwargs)
    Ответ написан
    Комментировать
  • Как обработать ошибку UnicodeDecodeError и при этом продолжить чтение файла?

    drygdryg
    @drygdryg
    Python-разработчик
    Откройте файл в двоичном режиме, читайте его построчно в цикле и пытайтесь отдельно декодировать каждую байтовую строку в строку с помощью .decode(), в одночасье обрабатывая ошибку UnicodeDecodeError:
    with open('1.txt', 'rb') as file:
        for n, binary_line in enumerate(file, start=1):
            try:
                line = binary_line.decode('utf-8')
            except UnicodeDecodeError:
                print(f'Ошибка декодирования строки {n}')
                continue
            ...
    Ответ написан
    2 комментария
  • Как выключить вывод на экран запросов к fastAPI серверу в python?

    drygdryg
    @drygdryg
    Python-разработчик
    Судя по всему, вы запускаете FastAPI-приложение с веб-сервером Uvicorn.
    Отключить журнал обращений к серверу можно с помощью флага командной строки --no-access-log. Команда для запуска веб-сервера может выглядеть, например, так:
    uvicorn --no-access-log main:app

    Документация: https://www.uvicorn.org/settings/#logging
    Ответ написан
  • Почему не может найтись модуль aiogram.client?

    drygdryg
    @drygdryg
    Python-разработчик
    Видимо, у вас установлена версия 2.x aiogram: в ней нет пакета aiogram.client. Установите версию 3.x так:
    pip install aiogram==3.0.0b7
    либо так:
    pip install --pre -U aiogram
    Ответ написан
    Комментировать
  • Как загрузить определенный домен под прокси?

    drygdryg
    @drygdryg
    Python-разработчик
    Скорее всего, для решения этой задачи вам потребуется настраивать промежуточный прокси-сервер на своей стороне, который, в свою очередь, будет перенаправлять входящие запросы на один из прокси-серверов из списка, либо пускать напрямую в зависимости от того, на какой домен осуществляется запрос.
    Возможно, для этого подойдёт сервер Squid: поищите в интернете, как в Squid перенаправлять запросы на другие прокси (типа "squid forward traffic to another proxy"), посмотрите на его ACL (access control list); ACL, скорее всего, можно использовать для опционального редиректа запроса по домену либо на прокси, либо пропуска напрямик без прокси.
    Ещё может быть, для этого подойдёт Pichi: https://github.com/pichi-router/pichi
    Ответ написан
  • Как нажать на кнопку в Selenium?

    drygdryg
    @drygdryg
    Python-разработчик
    Используйте метод click:
    element = driver.find_element(...)
    element.click()

    Как найти элемент кнопки, читайте здесь: https://selenium-python.readthedocs.io/locating-el...
    Ответ написан
    Комментировать
  • Почему дублируется слэш и не работают сырые строки?

    drygdryg
    @drygdryg
    Python-разработчик
    Потому что в Python обратная косая черта — это специальный символ, применяемый для экранирования других символов. Поэтому обратная косая черта не может быть сама по себе, и если вы не используете сырые строки (r'\'), то если хотите написать обратную косую черту, вам нужно экранировать её такой же обратной косой чертой ('\\'). И когда вы вводите символ "\" через сырую строку, Python при выводе внутреннего представления этой строки (representation, repr.) экранирует этот символ, что видно на вашем скриншоте.
    В официальной документации можно почитать об этом здесь: https://docs.python.org/3/reference/lexical_analys...
    Ответ написан
    Комментировать
  • Может ли телеграм бот логировать факт выхода пользователя из чата?

    drygdryg
    @drygdryg
    Python-разработчик
    Может. Реагируйте на апдейты, содержащие сообщения, в которых есть поле left_chat_member. Поле содержит объект User, в котором есть информация о пользователе, покинувшем чат.
    Ответ написан
    Комментировать
  • Как добавить текст на картинку в тг боте?

    drygdryg
    @drygdryg
    Python-разработчик
    Для рисования текста на изображениях по заданным координатам можно использовать Pillow.
    https://pillow.readthedocs.io/en/stable/reference/...
    Ответ написан
    Комментировать
  • Как отправлять рандомные сообщения через telethon?

    drygdryg
    @drygdryg
    Python-разработчик
    Вынесите вызовы random.choice из модуля text в отдельную функцию, и перед отправкой каждый раз вызывайте эту функцию. Например:
    def generate_random_sentence():
        """Создаёт случайное предложение"""
        ky = ['text', 'text2']
        k = random.choice(ky)
    
        zax = ['text', 'text2', 'text3']
        z = random.choice(zax)
    
        magz = ['text', 'text2', 'text3', 'text4']
        m = random.choice(magz)
    
        return f"{k}. {z} в {m}"
    Ответ написан
    Комментировать
  • Почему ошибка при импорте видео через tkvideo?

    drygdryg
    @drygdryg
    Python-разработчик
    ...
    RuntimeError: No ffmpeg exe could be found. Install ffmpeg on your system, or set the IMAGEIO_FFMPEG_EXE environment variable.

    Установите ffmpeg в ваше окружение (операционную систему) и добавьте путь к исполняемому файлу ffmpeg в переменную окружения PATH.
    Ответ написан
  • Почему запрос на сервер с использованием модели pydantic получает ошибку (FastAPI)?

    drygdryg
    @drygdryg
    Python-разработчик
    Здесь вы создали маршрут, который принимает GET-запрос с обязательным JSON-телом:
    @app.get('/user')
    def get_user(req: requests.IGetUser):
        return {}

    Но из axios вы отправляете GET-запрос с телом в формате формы (application/x-www-form-urlencoded), а не JSON, поэтому происходит ошибка валидации запроса и возвращается код ответа 422.
    Лучше принимайте "email" и "password" в параметрах запроса (query parameters), а не в теле, т.к., в общем, не рекомендуется отправлять GET-запросы с телом: для отправки полезной нагрузки (в формате JSON, формы и пр.) обычно используют другие типы запросов (POST, PUT, PATCH и пр.) Как принимать параметры запросов в FastAPI, описано в официальной документации.
    В вашем случае можно сделать так:
    @app.get('/user')
    def get_user(email: str, password: str):
        return {}

    Тогда запрос из axios можно отправлять так:
    axios.get('http://localhost:8000/user', {
            params: {
                email: 'user',
                password: 'user'
            }
        }).then(r =>
            console.log(r)
        )
    Ответ написан
    Комментировать
  • Как запустить фоновую функцию в боте телеграм построенную на библиотеке aoigram?

    drygdryg
    @drygdryg
    Python-разработчик
    Во-первых, если вы хотите выполнять фоновую задачу в том же процессе, где работает aiogram, не используйте библиотеки с блокирующим вводом/выводом (каковой является Requests), иначе ваш бот будет блокироваться (не будет реагировать на события из Telegram) во время осуществления HTTP-запроса. Лучше использовать асинхронные aiohttp либо httpx.
    Если при выполнении вашей задачи больше всего времени занимает ввод-вывод (то есть она является I/O-bound), можно использовать AsyncIOScheduler из APScheduler и делать асинхронный HTTP-запрос через aiohttp либо httpx.
    В противном случае, если больше всего времени занимают вычисления (то есть задача является CPU-bound), можно использовать BackgroundScheduler из того же APScheduler и делать синхронный HTTP-запрос через Requests или httpx. В качестве executor'а используйте ProcessPoolExecutor, чтобы задача выполнялась в отдельном процессе и по возможности на отдельном ядре CPU.
    https://apscheduler.readthedocs.io/en/3.x/userguid...
    UPD: если не требуется столь мощный функционал планирования задач, который предоставляет APScheduler, и всего лишь нужно выполнить функцию прямо сейчас, просто создавайте задачу asyncio, как упомянул выше SHADRIN.
    Ответ написан
    Комментировать
  • Что такое типы данных и в каких случаях лучше использовать определённый тип данных?

    drygdryg
    @drygdryg
    Python-разработчик
    В Python все типы данных делятся на изменяемые (англ. mutable) и неизменяемые (англ. immutable). Неизменяемые типы данных (например, строка, кортеж, frozenset) имеют несколько особенностей:
    - занимают меньше места в памяти, чем их изменяемые аналоги;
    - являются хэшируемыми (англ. hashable).
    Хэшируемые типы данных в отличие от нехэшируемых можно использовать в качестве ключей словарей, а также они могут быть элементами множеств.
    >>> a_set = frozenset({1, 2, 3})
    >>> hash(a_set)
    -272375401224217160
    >>> a_list = [1, 2, 3]
    >>> hash(a_list)  # Ошибка: список - нехэшируемый тип данных
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    >>> a_dict = {[1, 2, 3]: 'example_value'}  # Ошибка: нельзя использовать нехэшируемые типы данных как ключи словаря
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    >>> a_dict = {(1, 2, 3): 'example_value'}  # но можно использовать хэшируемые
    >>> a_dict
    {(1, 2, 3): 'example_value'}

    Неизменяемые типы данных имеют меньший размер (объём занимаемой оперативной памяти):
    >>> import sys
    >>> sys.getsizeof([1, 2, 3])  # Изменяемый тип данных list
    88
    >>> sys.getsizeof((1, 2, 3))  # Неизменяемый тип данных tuple
    64


    Вывод: используйте неизменяемые аналоги изменяемых типов данных тогда, когда вы хотите оптимизировать быстродействие своей программы и точно знаете, что вам никогда не потребуется изменять значения внутри структуры данных (например, когда вы получаете данные из внешнего источника по протоколу HTTP и читаете их), либо когда данные нужно использовать в качестве ключа словаря или использовать внутри множества.
    Ответ написан
    Комментировать
  • Работа скрипта по времени из БД?

    drygdryg
    @drygdryg
    Python-разработчик
    Используйте планировщик либо очередь задач, который(ая) поддерживает отложенное выполнение, например, APScheduler: создавайте задачу с выполнением в указанное время. Для планирования задачи можно периодически проверять (опрашивать) базу данных на наличие новых записей, и если таковые имеются, планировать для них задачи через планировщик, а записи удалять из базы.
    Но ещё лучше будет выяснить, откуда попадают time и chat_id в БД, и по возможности оттуда сразу же создавать задачу в планировщике, а не записывать в БД.
    Ответ написан
    1 комментарий
  • Как из отформатированной строки преобразовать в словарь?

    drygdryg
    @drygdryg
    Python-разработчик
    Например, так:
    my_dict = {'example': [1, 2, 3]}
    lines = ['{}|{}'.format(k, '|'.join(map(str, v))) for k, v in my_dict.items()]
    print('\n'.join(lines))
    my_reconstructed_dict = {k: [int(i) for i in v.split('|')] for k, v in (i.split('|', maxsplit=1) for i in lines)}
    assert my_reconstructed_dict == my_dict
    Ответ написан
    Комментировать
  • Как отформатировать вывод value словаря в python?

    drygdryg
    @drygdryg
    Python-разработчик
    Вам нужно отдельно соединять списки v в строки, прежде чем передавать их в str.format():
    my_dict = {'example': [1, 2, 3]}
    lines = ['{}|{}'.format(k, '|'.join(map(str, v))) for k, v in my_dict.items()]
    print('\n'.join(lines))

    Результат:
    example|1|2|3
    Ответ написан
    1 комментарий
  • Где искать документации(по пайтон)?

    drygdryg
    @drygdryg
    Python-разработчик
    Для работы с официальной документацией Python и поиска по ней можно использовать сервис DevDocs: https://devdocs.io/python/
    Он удобен тем, что позволяет искать по документации к различным версиям Python одновременно. Также он позволяет скачивать документацию и читать её без подключения к интернету, следить за своевременным обновлением скачанных документаций.
    Ответ написан
    Комментировать
  • Как вывести все качества видео одного видео pytube?

    drygdryg
    @drygdryg
    Python-разработчик
    Например, так:
    from pytube import YouTube
    
    yt = YouTube("https://youtu.be/uCNWuSbPnt4")
    resolutions = sorted(
        set(stream.resolution for stream in yt.streams.filter(type='video')),
        key=lambda s: int(s.split('p')[0])
    )
    print(*resolutions, sep='\n')

    Результат выполнения программы:
    144p
    240p
    360p
    480p
    720p
    1080p
    1440p
    2160p
    Ответ написан
    Комментировать
  • Python telegraph асинхронный upload изображений, как сделать?

    drygdryg
    @drygdryg
    Python-разработчик
    Используйте aiohttp либо httpx в качестве HTTP-клиента вместо Requests, т.к. последний не поддерживает asyncio.
    Ответ написан
    Комментировать