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

    @ykalchevskiy
    tornado.gen.coroutine + yield != асинхронность. Вызовы, которые делаются должны уметь работать асинхронно. Смотрим здесь первый пример:
    class AsyncHandler(RequestHandler):
        @asynchronous
        def get(self):
            http_client = AsyncHTTPClient()
            http_client.fetch("http://example.com",
                              callback=self.on_fetch)
    
        def on_fetch(self, response):
            do_something_with_response(response)
            self.render("template.html")

    Метод fetch объекта класса AsyncHTTPClient -- асинхронный. На это указывает аргумент callback (и название класса, конечно :)). Когда страница будет получена, вызовется _on_fetch. Как и в AJAX.
    Пример ниже на этой же странице -- это переписанная версия того же самого, просто красивее, без лапши коллбеков. Для этого и нужна пара tornado.gen.coroutine + yield.

    Вызов time.sleep(2) блокирует весь ioloop, вместо него можно воспользоваться чем-то типа
    yield tornado.gen.Task(tornado.ioloop.IOLoop.current().add_timeout, time.time() + 2)


    Но даже заменив эту строку, асинхронности не будет заметна. Это связано с ограничениями браузеров: они не умеют одновременно открывать одну и туже вкладку. Поэтому нужно открыть вкладки в разных браузерах.

    Еще одно: декоратор @tornado.web.asynchronous не нужен при использовании @tornado.gen.coroutine.

    Вот эту страничку нужно обязательно прочитать.
    Ответ написан
    Комментировать
  • Можно ли получить атрибут модуля при помощи __import__()?

    @ykalchevskiy
    Да, на самом деле эта функция работает не так, как хотелось бы. Например, в tornado для таких целей есть функция tornado.util.import_object. Исходник должен быть понятен.
    Ответ написан
  • Как происходит импортирование в Python?

    @ykalchevskiy
    Я не очень понимаю первый вопрос, поэтому на него ответить не могу. А вот почитать про подробности можно тут: asvetlov.blogspot.ru/2010/05/blog-post.html и следующие части.

    Upd (вопрос уточнен в комментарии):
    >>> import sys
    >>> import small
    >>> sys.getrefcount(small) - 1
    2
    >>> del small
    >>> sys.getrefcount(sys.modules['small']) - 1
    1

    При первой загрузке модуль попадает в словарь sys.modules, после этого используется уже эта загруженная версия. del small не удаляет модуль, а только уменьшает количество ссылок на него.
    Ответ написан
    2 комментария
  • Как найти ошибку в программе(решение задачи) Python?

    @ykalchevskiy
    Вы считаете, что все числа -- цифры. То есть, что все элементы матрицы по модулю от 0 до 9. Но это, очевидно, не так. Чтобы упростить получение частей из строки, воспользуйтесь методом split:
    str_numbers = a.split()
    Ответ написан
    Комментировать