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

    xenon
    @xenon
    Too drunk to fsck
    def x():
        print("x called")
    fname="x"
    globals()[fname]()


    Ответ со словарем (выше) хороший. А еще есть встроенный словарь символов, который выдает globals().
    И eval() - тоже вариант. Но если fname у вас идет из ненадежного источника (пользователя) - то это опасно (через globals() - тоже опасно). Например:

    globals()['os'].system("clear")
    Вызовет clear, а может вызвать и rm -rf / .

    Если нужен безопасный eval - советую посмотреть на evalidate (disclaimer: этой мой пакет), и там по ссылкам еще альтернативы есть - asteval и simleeval. Через них можно (если аккуратно) сделать безопасный eval и проверить его популярным джейлбрейками (в evalidate они есть, и есть в тестах к нему).
    Ответ написан
    Комментировать
  • Отличается ли мультипроцессинг от запуска нескольких программ?

    xenon
    @xenon
    Too drunk to fsck
    А запуск просто 20 раз даст то, что вам нужно? Не требуется никакая коммуникация между процессами?
    Тогда однозначно запускайте просто 20 копий программы, можно через parallel (стандартная утилита, есть наверное, везде) или просто своим шелл-скриптом. Будет быстрее и надежнее.

    В пайтоне есть GIL и это сильно влияет на производительность в многопоточном режиме. Да и вообще, зачем усложнять? Один изолированный процесс, который делает какую-то простую функцию - это богоугодно. А если вы делаете монстра, который внутри себя запускает потоки/процессы то только в идеале вы приблизитесь к рекомендуемому варианту. А не в идеале - будете иметь проблемы с производительностью или какие-то сложноуловимые глюки и race conditions.

    Многопоточность оправдана только если без нее никак, например, нужна коммуникация между процессами, работа с общими данными.

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

    xenon
    @xenon
    Too drunk to fsck
    Некрасивое решение: просто в том же каталоге держите тестовый скрипт и подключаете ее, прямо сходу, не устанавливая. Делаете что-то вроде export PYTHONPATH=. и импортируете ее в этом скрипте, типа import mylib (она загрузится из ./mylib)

    Более красивое решение - используйте тесты. То что вы делаете ("нужно дебажить") - это же по сути тестирование и запускаете их через pytest.

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

    xenon
    @xenon
    Too drunk to fsck
    Каждое TCP соединение идентифицируется через кортеж - IP + порт сервера, IP + порт клиента.
    После подключения нужно узнать эти параметры и в каком-то списке держать эти 4 + id клиента.

    При ловле эксепшна - нужно не просто активировать свой код, а еще и взять сам exception (except ConnectionResetError as e:`) и через e, узнать, что это за соединение (возможно там нужно будет добраться до socket, а через него уже узнать конкретные адреса-порты). Затем сопоставляем это по своей табличке и узнаем, кто отвалился.
    Ответ написан
    Комментировать
  • Выдает ошибку None 1=, как решить?

    xenon
    @xenon
    Too drunk to fsck
    вот тест test_triple_free_space_algorithm у вас проваливается, потому что возврат от self.calculator.free_space_algorithm(...) у вас None, а ожидается
    {'left_corner': {'x': 2, 'y': 1}, 'right_corner': {'x': 5, 'y': 8}}

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

    xenon
    @xenon
    Too drunk to fsck
    У вас как выглядит directory? Это список строк, как я понимаю. А writerows ожидает "список списков строк". (каждый элемент верхнего списка, список из строк, каждая строка в отдельную клетку).
    Вот поэтому он строку и итерирует побуквенно, обрабатывая ее как список.

    попробуйте в directory.append() давать не строку, а список из одного элемента (этой строки) и должно быть счастье.
    Ответ написан
    3 комментария
  • Как обращаться к элементам json через точку?

    xenon
    @xenon
    Too drunk to fsck
    Вроде нет. Тем более, что JSON - это вообще строка, по индексу вы обращаетесь уже когда преобразовали его в словарь (dict).

    Но два варианта:
    1. Вы можете после преобразования "расплющить" словарь, сделать его плоским, преобразовав вложенные ключи в вид foo.bar.
    2. Вы можете сделать свой класс (от dict), и переписать метод __getitem__(self, index)
    Ответ написан
  • Почему высвечивается OSError: [Errno 98] Address already in use после выхода из программы и повторного запуска?

    xenon
    @xenon
    Too drunk to fsck
    Добавьте одну строчку после socket.socket:
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    Ответ написан
  • Как сделать так чтобы бот упоминал пользователя который написал ему команду(в группе)?

    xenon
    @xenon
    Too drunk to fsck
    В моем случае, в моем боте, с той либой, которую я использую:

    tgname = message.from_user.username

    Чтоб можно было ответить конкретнее - надо знать, какая библиотека для телеграм-бота используется.
    Но универсальный ответ - смотрите все доступные в коде данные (параметр message обычно), и печатаете его на консоль или делаете dir(message) и увидите имеющиеся поля. Что-то из них наверняка будет тем, что нужно.
    Ответ написан
    Комментировать
  • Как сделать sleep на N секунд либо до прихода HTTP запроса (асинхронный cron с http сервером)?

    xenon
    @xenon Автор вопроса
    Too drunk to fsck
    Был совет использовать Firebase Cloud Messaging (FCM), которым доставляются push уведомления на устройство. Немного странно, но похоже, его невозможно использовать на десктопе в качестве клиента (принимать сообщения). В python библиотеке нет кода для этого. Даже задал вопрос разработчику PyFCM, его ответ:

    You can only receive messages via an Android, iOS or web client https://firebase.google.com/docs/cloud-messaging#h...

    An iOS, Android, or web (JavaScript) client app that receives messages via the corresponding platform-specific transport service.



    Для себя решил так:

    from http.server import BaseHTTPRequestHandler, HTTPServer
    class RequestHandler(BaseHTTPRequestHandler):
            # implementation
    
    httpd = HTTPServer((self.address, self.port), RequestHandler)
    httpd.timeout = 1
            
    while True:
        httpd.handle_request()
        # check if quit


    Использование метода handle_request вместо serve_forever() позволяет нам получать управление каждый раз по обработке каждого запроса и проверять, не пора ли выйти или исполнить другие действия. А использование timeout=1 дает нам возврат через 1 секунду даже если запросов не было. В итоге
    Ответ написан
    Комментировать
  • Почему я не могу сделать запись в базу данных SQlite?

    xenon
    @xenon
    Too drunk to fsck
    Упростите код, уберите все ненужные для отладки строчки (даже если они нужны в работе), чтобы четко было видно, где происходит чудо и почему. Добавьте print'ов чтобы посмотреть, как проходит код и распечатывайте переменные. Дальше, скорее всего, вы сами увидите, где у вас проблема, а если нет - то сможете ее свести до кода с 2-3 строчками.

    Возможно, забыли сделать commit() ?
    Ответ написан
  • Почему Python пропускает первую строку?

    xenon
    @xenon
    Too drunk to fsck
    Да нормально вроде выводит:

    xenon@braconnier:/tmp$ cat x.py
    with open('txt') as text:
        for line in range(0, 3):
            line = text.readline()
            print(line) # Вывод начинается со Addidas
    xenon@braconnier:/tmp$ cat txt 
    Termit
    Addidas
    Nike
    xenon@braconnier:/tmp$ python x.py 
    Termit
    
    Addidas
    
    Nike


    Вы может открываете как-то странно? (в примере не показали откуда text берется)
    Ответ написан
    1 комментарий
  • Как сделать авторизацию через python?

    xenon
    @xenon
    Too drunk to fsck
    1. Нужно один раз авторизоваться, а потом работать с той же сессией (а не передавать логин-пароль каждый запрос). Авторизоваться - на страничке типа /login (посмотрите в браузере, как сайт делает), посылать логин-пароль на не ту страницу смысла нет.
    2. Авторизация, если правильно сделана, делается через HTTP POST запрос (а не GET).
    Ответ написан
  • Для каких задач в веб-разработке очень хорошо подходит питон?

    xenon
    @xenon
    Too drunk to fsck
    Скажу как я (давным-давно) выбирал между Руби и Питоном. Это сейчас они более-менее по нишам разделились, а тогда оба были примерно одинаковыми новыми-модными языками. Поглядел список проектов на том и на другом. Везде немало. Но было принципиальное различие. На Руби почти все проекты были "полезные". Дали рубисту задачу, он ее исполнил и код в GPL выложил. А вот на Питоне было дофига "бесполезных" проектов, которые люди делали явно не ради денег. Вывод - на питоне писать приятно. Это важно.

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