Задать вопрос
Ответы пользователя по тегу Python
  • Обязательно ли использовать асинхронные функции с asyncio?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вся эта асинхронщина нужна для одной единственной цели - не ждать, пока другие процессы работают.
    Если вы можете обойтись без асинхронного кода и вам не мешают блокировки на время доступа к БД, то зачем вам вообще asyncio и aiohttp? Используйте тогда flask и запускайте gunicorn'ом много одинаковых процессов с вашим приложением и работайте в них синхронно.

    Если вы в асинхронном коде сделаете блокирующий вызов к БД и будете ждать пока она ответит, то вы в этом месте убиваете всё полезное, что даёт вам асинхронщина, но оставляете все неудобства, ведь асинхронный код сложнее синхронного, его труднее писать, труднее отлаживать, труднее тестировать, труднее читать.
    Ответ написан
    Комментировать
  • Как доставать id чата из id беседы с помощью регулярки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Жесть.
    int('2000000179'[1:])
    int('2000000003') - 2000000000

    Решил вырезать другу аппендицит. Слышал, что он растёт внизу живота. Скажите, его можно достать через задницу, если нет, то куда тыкать ножиком?
    Ответ написан
    1 комментарий
  • Как отсортировать словарь по значению?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    {
        key: value 
        for _, key, value in 
        sorted(
            (-int(v), k, v)
            for k, v in
            workers.items()
        )
    }
    Ответ написан
    Комментировать
  • В чем разница между 'AND' и '&'?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    разница в том, что `and` - это логическая операция, её нельзя перекрыть, то есть нельзя у объекта реализовать метод, который будет реализовывать свой алгоритм вычисления результата операции.
    Связано это со стандартными оптимизациями логических выражений, которые (оптимизации) есть почти во всех языках.
    Грубо говоря операция `and` (конъюнкция) принимает два аргумента (слева и справа) и возвращает значение первого попавшегося ложного или последнего истинного, если все истины.
    Например:
    'one' and 0  # вернёт 0
    '' and 13  # вернёт ''
    3 and 5  # вернёт 5

    Дезъюнкция (or) работает похожим образом, но возвращает первый попавшийся истинный рагумент, или последний ложный, если ложны оба:
    3 or 5  # вернёт 3
    '' or 'hello'  # вернёт 'hello'
    None or 0 # вернёт 0

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

    Операции & | по своему принципу работы ничем не отличаются от сложения, вычитания, умножения, деления, проверки на равенство и неравенство и многих других операций. Все эти операции могут быть перекрыты. То есть написав такой класс:
    Class MyClass:
        def __and__(self, right_argument):
            result = 'что угодно'
            print(f'Фигасе: {self} & {right_argument} -> {result}')
            return result
    
    a = MyClass()
    b = MyClass()
    print('Вот так вот:\n', a & b)

    Фигасе: <__main__.MyClass object at 0x7f3df1aeb588> & <__main__.MyClass object at 0x7f3df1aeb438> -> что угодно
    Вот так вот:
     что угодно


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

    Я просто уверен, что автор вопроса не поймёт до конца то, что я тут объяснял, но, возможно, кому-то пригодится.

    Удручает, что люди не хотят учиться, а хотят сразу быть готовыми программистами и писать в прод.
    Ответ написан
    6 комментариев
  • Как искать несколько слов в предложении?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Похоже ботов кинулись писать даже те, кто вообще программировать не умеет. Надеюсь эта волна не докатится до медицины.

    Напишите свою функцию, куда передайте текст и набор слов, а внутри по циклу ищите каждое пока не найдёте первое попавшееся.
    Ответ написан
    Комментировать
  • Как установить модули python без интернета и pip?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Kostyan4ik, почему это нет возможности? С питоном всегда можно найти какую-нибудь возможность.

    Вот, к примеру, вы можете на том компе, где есть питон и интернет, скачать все необходимые пакеты с помощью того же pip:
    pip download pip
    Так вы можете скачать все необходимые пакеты и принести их на машину без инета просто на флешке.
    А там:
    python pip-20.1.1-py2.py3-none-any.whl/pip install pip-20.1.1-py2.py3-none-any.whl

    Тут происходит маленькая магия: вы с помощью питона запускаете pip прямо изнутри локально лежащего файла с его дистрибутивом. Этим pip'ом вы ставите самого себя на локальную машину. Примерно как Барон Мюнхаузен, но не больно.

    Вы также можете сохранить перечень всех установленных пакетов на компе с инетом в текстовый файл, а потом, убрав из него лишнее, скачать все эти пакеты в локальный каталог, отнести на оффлайн-комп и там ставить через тот же pip
    pip freeze > r.txt
    pip download -r r.txt
    Ответ написан
    3 комментария
  • Почему Python выдаёт ошибку unhashable type: 'dict'?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы пытаетесь в качестве ключа в словаре использовать нехешируемый тип (в данном случае судя по ошибке тоже словарь user_group).
    Ключем в словаре может быть только хешируемый тип, например кортеж (без вложенных нехешируемых элементов), строка, число и т.д.

    Относитесь, пожалуйста, с уважением к людям на этом ресурсе: оформляйте код тегами и полностью приводите стек-трейс ошибок.
    Ответ написан
    Комментировать
  • Как отделить рубли от копеек?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    price = input()
    r, c = (list(map(int, price.split('.'))) + [0])[:2]

    а регекспы тут действительно ни к чему. По крайней мере не для таких простых случаев они.
    Ответ написан
    5 комментариев
  • Добавление кнопкни Tkinter, при нажатии на которую, открывается другой Python файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Типовая структура проекта на питоне:|
    my_project_name\            # корневой каталог проекта
        .git                    # каталог с данными контроля версий
        my_project_name\        # каталог главного пакета вашего проекта
            __init__.py         # файл, который делает из этого каталога пакет. Файл можно оставить пустым
            my_script1.py       # Скрипт, который вы возможно захотите хапустить внутри вашего проекта
            my_script2.py       # Ещё один скрипт
            my_module1.py       # модуль, который вы хотите импортировать внутри проекта
            my_module2.py       # ещё модуль
            my_sub_package\     # если модуль уже хочется разбить на несколько файлов, то можно сделать пакет
                __init__.py     # этот файл делает из каталога с исходниками пакет, который позволит ммпортировать его как модуль
                my_module3.py   # это модуль внутри пакета
                my_module4.py   # ещё один
    
        my_lib1\                # это пакет, который не зависит от вашего проекта, но используется в нём и вы почему-то
                                # хотите хранить их в одном репозитории. Странное решение, но так тоже можно.
            __init__.py         # да, этот каталог стал пакетом благодаря этому файлу
            my_lib_module.py    # тут может быть ещё много модулей
    
        setup.py                # этот файл нужен, чтобы все эти пакеты (их сейчас тут два) можно было ставить через
                                # пакетный менеджер питона, например pip
        readme.txt              # ридми. Те, кто не делают ридми, рискуют немножко гореть в аду.

    Вы можете импортировать из одного модуля другие абсолютным иотносительным импортом.
    Я рекомендую, пока у вас мало лпыта, пользоватьс яотносительным и не переусложнять с этим.
    Например, чтобы в my_script1 вызвать функцию из другизх модулей и пакетов, пишите так:
    from my_project_name.my_module1 import my_function1
    from my_project_name.my_sub_package.my_module3 import my_function3
    
    from my_lib1 import my_lib_module
    from my_lib1.my_lib_module import my_lib_function1

    Вызываются и используются импортированные имена как обычно, будто они локально определены.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сделайте print(newchat) и сразу увидите что не так.
    Ответ написан
    3 комментария
  • Какими способами можно отображения чужую гео локацию в режиме 24 на 7?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    питнашки

    Вам нужно арендовать самую дешевую VDS, купить какой-нибудь домен, настроить на vds nginx и заиметь сертификат через letsencrypt.
    Так у вас будет 24/7 cервер с https в инете.
    Потом деплоите на сервер своё приложение на каком-нибудь flask'е. Можно подготовить шаблон проекта с помощью так называемого кукикаттера, например такого.
    На выходе у вас получится "рыба" полноценного RESTful API приложения с готовым CI/CD и почти всем, что необходимо для нормальной жизни.
    Вам останется лишь реализовать пару своих методов:
    • push_me - запостить свою позицию
    • all - взять актуальные координаты всех юнитов

    Это минимум. По-хорошему, конечно, желательно сделать это всё на asunc-io и использовать веб-сокеты для обновления координат цели.
    Ещё, исходя из специфики вашей задачи, можно задействовать RTSP.
    Ответ написан
    6 комментариев
  • В чем ошибка модуля?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Уберите не ascii-символы из токена и телефона или сконвертируйте их в utf-8 сами.
    Ответ написан
    Комментировать
  • Параметры по-умолчанию Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вычисление умолчаний происходит не в момент вызова, а в момент объявления функции. Не делайте так. Само собой у вас значение параметра по умолчанию осталост аким, каким оно было до создания файла.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    pandas не нужен.
    import sys 
    with open('tmp/new.csv') as fin: 
        w = csv.writer(sys.stdout) 
        for row in csv.reader(fin): 
            x = row[-1] 
            x2 = x*2 
            row.append(x2) 
            w.writerows([row])
    Ответ написан
    Комментировать
  • Удобно ли разрабатывать GUI на Python для Windows в Linux системах?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Переходи. Никаких проблем с путями. Пути в линуксе проще, чем в винде, но если будешь использовать pathlib, который, кстати, теперь в стандартной библиотеке, то различий вообще не будет. Можно писать кроссплатформенный код.

    ИМХО, в линуксе разрабатывать проще и удобнее за счет нормальной абстракции файловой системы, за счет развитой командной строки и утилит, за счет пакетных менеджеров вроде apt и прочих, за счет нативной среды для работы с докер-контейнерами.

    ИМХО, разрабатывать нативные GUI - это прошлый век. Постепенно всё переходит в веб, есть Электрон. Делать веб-интерфейс и бэкенд с API - это куда более универсальный подход. Наверно на текущий момент, разве что, большие CAD-системы ещё имеет смысл делать нативными. И то это уже спорный вопрос.
    Ответ написан
  • Как вычислить центр круга с радиусом 40?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы, конечно, "гениально" ставите задачу.
    Но предположим, что вы просто не подумали что может быть непонятного в вашей постановке вопроса.
    Если речь идёт о круге на плоскости в декартовых координатах, то радиуса для вычисления координат центра круга вам будет не достаточно.
    Потребуется, как минимум, либо точка на границе круга и направление (например, вектор нормали), тогда центр будет вычисляться векторной разностью координат точки и произведения нормали на радиус.
    Можно найти центр по радиусу и двум точкам на границе круга. Какие входные данные?
    Ответ написан
    Комментировать
  • Почему if text == line не срабатывает, хотя на выходе text = а, line = а?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если у оператора `in` оба аргумента строки, то этот оператор возвращает вхождение подстроки в строку. Буква "а" есть в слове "автомобиль" и тут ничего удивительного нет. Вы очень небрежно и неаккуратно формулируете вопрос. Наверняка не понимаете как работают операторы и не знаете, что при чтении из файла в строках остаются символы абзацев.

    Приводите значение строк полностью. Вы можете не заметить абзаца, если печатаете строку. печатайте repr(text), там будет видно непечатные символы.
    И если text = а, line = а, код просто игнорит данное совпадение

    Вот это поведение скорее всего обусловлено либо непечатными символами, либо буква у вас на разных языках написана.

    Приводите код полностью. В текущем виде вы, сами того не понимая (как, гапример в случае с непечатными символами), можете не придать значения важным вещам. Вы, вон, даже кавычки ставить ленитесь.
    Ответ написан
    6 комментариев
  • Как получить все перестановки элементов массива?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    import itertools
    
    for variant in itertools.permutations([a, b, c, d]):
        print(variant)
    Ответ написан
    1 комментарий
  • Как задавать места, в которых интерпретатор python осуществляет поиск?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Помимо способа, указанного в соседнем ответе, есть еще способ сделать это из самой программы на питоне:
    import sys
    
    sys.path.append('some/custom/path/to/modules_and_packages_collection_folder')
    Ответ написан
    Комментировать
  • Как вывести отличающиеся (ключ, значение) одного словаря от другого словаря?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы как-то не очень четко поставили задачу.
    1. Нужно прояснить следующие важные детали:
    2. У различной пары может отличаться как ключ, так и значение по отдельности?
    3. Наборы ключей одинаковые? Неодинаковые? Могут отличаться?
    4. Значения хешируемые?
    5. Количество пар совпадает, или одна пара в одном из словарей может отсутствовать?
    6. Одна и только одна пара?
    7. Какая версия Питона? Если третья, то словари одинаково упорядочены по ключу? Может быть они еще и отсортированы? Ну мало ли...
    8. Насколько большие словари? Их размер сопоставим с полным объёмом памяти?
    9. Ваша задача выглядит так, будто имеет смысл решать её немного в другом месте и в другое время (в смысле формирования структуру данных и заполнения их). Поясните почему такая задача возникла, возможно есть другой, более элегантный и эффективный подход, нежели сравнивать большие словари.


    Похоже вот это будет для вас приемлемым решением:
    import typing
    
    def ddif(a: dict, b: dict) -> typing.Iterable[tuple]:
        return filter(None, (None if va == b[k] else (k, va, b[k]) for k, va in a.items()))
    
    a = {1: 11, 2: 22, 3: [1, 2, 3], 4: 44, 5: 55}
    b = {1: 11, 2: 22, 3: [1, 2, 4], 4: 44, 5: 56}
    for k, v1, v2 in ddif(a, b):
        print(f'{k}: {v1!r} != {v2!r}')

    Там возвращается итератор, поэтому, если вы уверены, что различие только одно, то можете воcпользоваться islice, чтобы остановиться на первом различии:
    from itertools import islice
    print(
        list(islice(ddif(a, b), None, 1))
    )
    Ответ написан
    2 комментария