• Как хранить константы в python?

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

    Но учтите, что вам может захотеться хранить в таких вот местах какие-то чувствительные, т.н. секретные данные. Например, ключи шифрования, пароли для подключения к БД или другим сервисам, ключи API, всякие токены и т.д. Такие данные опасно, неудобно и неправильно хранить в репозитории вместе с кодом. Для хранения таких параметров тоже нужно использовать библиотеки для хранения, сериализации и десериализации настроек.

    Возможно у вас возникнет соблазн сейчас сделать вот так по-простому, а чувствительные данные и секреты тоже импортировать в виде питоновских модулей, но эти модули добавить в игнор-лист репозитория, а импортировать с соответствующим перехватом ошибок импорта... Так можно сделать, если вам критически не хочется брать в проект лишние зависимости, но это тот ещё геморрой. Лучше использовать специальные механизмы хранения настроек сразу. Тем более это потребует меньше кода (который нужно еще и тестировать) и сложности (которую принято выносить и тестировать отдельно, чем такие либы как Pydantic и занимается).
    Ответ написан
    1 комментарий
  • Python Replace ломает файл. Почему?

    LaRN
    @LaRN
    Senior Developer
    А если не делать REPLACE в имеющемся файле, а создать новый файл, условно C:\\m\\notice_tmp.ini и туда сохранить новую версию содержимого, после чего удалить старый файл, а новый переименовать в C:\\m\\notice.ini.
    Ответ написан
    1 комментарий
  • Текстовый калькулятор на Python. Как реализовать поддержку деления?

    LaRN
    @LaRN
    Senior Developer
    Попробуйте использовать тип Decimal.
    Как-то так
    >>> # Import the Decimal type from the decimal module
    >>> from decimal import Decimal
    
    >>> # Values are represented exactly so no rounding error occurs
    >>> Decimal("0.1") + Decimal("0.2") == Decimal("0.3")
    True
    
    >>> # By default 28 significant figures are preserved
    >>> Decimal(1) / Decimal(7)
    Decimal('0.1428571428571428571428571429')
    
    >>> # You can change the significant figures if needed
    >>> from decimal import getcontext
    >>> getcontext().prec = 6  # Use 6 significant figures
    >>> Decimal(1) / Decimal(7)
    Decimal('0.142857')
    Ответ написан
    Комментировать
  • Как записать текст из базы данных в txt файл делая отступы?

    includedlibrary
    @includedlibrary
    myfile = open('test.txt', 'w')
    Когда открываете файл в режиме 'w', вы открываете его на перезапись. Можно вместо 'w' передать 'a', тогда всё будет записываться в конец файла. Но, во-первых, в вашем коде один файл на всех пользователей (не знаю, была ли цель сделать именно так, поэтому пишу), во-вторых, могут быть дубликаты, т.е. желательно добавить проверку на уникальность. Можно взять СУБД (если нужно хранить всё в файле, то можно использовать sqlite), тогда и работать с несколькими пользователями будет проще и проверку на укникальность самому писать не придётся. Также использование СУБД позволит в будущем без проблем хранить какие-либо ещё данные, кроме URL прокси серверов
    Ответ написан
    Комментировать
  • Ошибка NameError: name 'np' is not defined?

    Maksim_64
    @Maksim_64
    Data Analyst
    Попробуй установить если не установлен numpy и импортировать его import numpy as np
    Ответ написан
    Комментировать
  • Как исправить ошибку?

    @Zzzz9
    cur.execute(f"INSERT INTO users (id, class, liter) VALUES (?, ?, ?)",(id_user,class_user,litera_user))
    Ответ написан
    Комментировать
  • Как заставить бота копировать строки в txt поочередно?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    with open('asdf') as file:
        for line in file:
            # Что-то со строчкой
            pass
    Ответ написан
    Комментировать
  • Почему вылетает программа в ходе работы через консоль Python?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Скорее всего проблема в этой строке:
    encrypted_password_file = open('password_database.txt', 'r')  # viewing the password database


    Ты указываешь локальный путь к файлу - относительно рабочей директории. При запуске она может быть не той, где лежит файл password_database

    P.S. открывать файлы лучше через
    with open('password_database.txt', 'rt') as encrypted_password_file:
         # код

    поищи что такое контекстные менеджеры
    Ответ написан
    Комментировать
  • Как сделать нормальные глобальные переменные?

    SoreMix
    @SoreMix
    yellow
    Читаем в тему машин состояний, FSM Aiogram: https://docs.aiogram.dev/en/dev-3.x/dispatcher/fin...

    Там уже в зависимости от того, для чего нужна переменная. Судя по всему это не должно быть константой, тогда используем БД какую нибудь, если это должна быть переменная, которая может например правиться администратором/другим человеком и оставаться единой для всех.

    Если переменная задается на каком-то из этапов ввода ответа пользователя - FSM
    Если некое подобие конфига для всех пользователей - БД
    Ответ написан
    Комментировать
  • Как открыть дополнительное окно терминала через SSH?

    @Drno
    а причем тут доп окна ssh, если она черным по белому просит или не запусктаь её от root или убрать эту проверку из исполняемого файла?
    да и если она требует графич стола, то без него ты не обойдешься жеж... разве что псевдографикой(не уверен)
    Ответ написан
    2 комментария
  • Ошибка при обработки данных что делать?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Вывод из cursor.fetchone() нужно записать в переменную и работать с ним дальше, не надо каждый раз вызывать этот метод.
    Ответ написан
    Комментировать
  • В чем заключается ошибка в коде python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Это типичная ошибка тех, кто не учил язык. Попробуйте так:
    if self.s1 in [color1, color2]:
    Ответ написан
    4 комментария
  • Python asyncio list does not processing asyncrounouslly because of what?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    В первом случае ты грубо говоря все запускаешь синхронно: синхронно итерируешься по списку, await'ишь - все последовательно

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

    Lynn
    @Lynn
    nginx, js, css
    Очень грубая аналогия как вообще работает интернет на примере почты.

    1. Не шифрованный трафик (http) — это открытка. На ней почтальон (провайдер) видит и адрес и текст.
    2. Обычный шифрованный трафик (https) — это письмо, почтальон видит адрес, но не текст.
    3. VPN (обычно подразумевается что зашифрованный, хотя в теории это необязательно) — у вас есть доверенный секретарь и все свои письма/открытки вы упаковываете в ещё один конверт и отправляете секретарю и ваш почтальон видит только его адрес. Потом секретарь открывает ваше сообщение и пересылает ваше письмо/открытку дальше. При этом почтальон секретаря видит адрес (и текст окрытки) так же как и в пп 1 и 2, но в качестве обратного адреса видит адрес секретаря, а не ваш.

    Вы хотите посадить секретаря у себя в квартире. Подумайте ещё раз.
    Ответ написан
    1 комментарий
  • Можно ли в Python сделать такой механизм, чтобы при изменении значения в любой ветки словаря, я был уведомлен?

    fenrir1121
    @fenrir1121
    Начни с документации
    Наследование от dict повлечет за собой неявные ошибки, используйте предназначенный для этого collections.UserDict
    from collections import UserDict
    class MyDict(UserDict):
        def __setitem__(self, key, value):
            print(f'Меняем значение {key} на {value}')
            super().__setitem__(key, value)


    Мне нужно чтобы при изменении любого значения словаря, в том числе значения словаря по ключу 'z', выполнялся определенный код.

    Очевидно вам это нужно для ваших конкретных словарей с бизнес логикой. И это нормально что они будут отдельным классом. Питон под капотом тоже использует словари и там явно не должен выполняться ваш код.
    Ответ написан
    Комментировать
  • Как при переходе по ссылке в телегамм бот автоматически вызывать команду /start?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Никак нельзя. Это же мечта любого спамера - чтобы пользователь не мог избежать действия.
    Ответ написан
    Комментировать
  • Как остановить процессы с библиотекой multyprocessing?

    @dima20155
    you don't choose c++. It chooses you
    Избавиться от сообщений об ошибках каких?
    Прежде всего посмотрите хотя бы примеры использования multiprocessing
    https://docs.python.org/3/library/multiprocessing.....
    Вы должны передать в таргет не результат выполнения функции count_vis(), а саму функцию (указатель на функцию, если хотите в терминах С или функтор), то есть count_vis, а следующим аргументом args - то, что принимает ваша функция в качестве входных параметров.

    Вот прям копипаст из документации, посмотрите в чем отличия от вашего кода.
    from multiprocessing import Process
    
    def f(name):
        print('hello', name)
    
    if __name__ == '__main__':
        p = Process(target=f, args=('bob',))
        p.start()
        p.join()
    Ответ написан
    1 комментарий
  • Реалтайм на питоне возможен?

    vabka
    @vabka
    Токсичный шарпист
    Нет. Планировщик ОС легко может ворочать приоритетами твоего приложения и от этого скорость немного будет скакать.
    Также тут будет влиять скорость компьютера.
    Чуть лучше будет, если попробуешь задавать задержку явно через sleep.

    Если хочется приблизиться к чему-то более-менее равномерному - используй таймеры, которые предоставляет ОС.

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

    А чтобы измерить задержки - выводи время в каждом таком такие (можно даже не реальное, а системное).

    Потом посмотри на равномерность интервалов через какой-нибудь excel.
    Ответ написан
    Комментировать
  • Как правильно обработать # IndexError: string index out of range?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Правильно вообще не доводить до возможности появления такой ошибки. Например обойти строку функцией pairwise, чтобы индексы не понадобились.
    Ответ написан
    3 комментария
  • Ошибка Allowed memory size of 4294967296 bytes exhausted (tried to allocate 81920 bytes)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Исправить скрипт, чтобы ему для работы не требовалось 4 Gb оперативки.
    Ответ написан
    1 комментарий