Как использовать закрытие Python для написания функций обратного вызова - PullRequest
0 голосов
/ 03 февраля 2019

Я нашел этот код на странице справочника Amazon.Он используется для создания объектов обратного вызова, которые могут передаваться в качестве аргумента функции загрузки модуля передачи :

class ProgressPercentage(object):

def __init__(self, filename):
    self._filename = filename
    self._size = float(os.path.getsize(filename))
    self._seen_so_far = 0
    self._lock = threading.Lock()

def __call__(self, bytes_amount):
    # To simplify we'll assume this is hooked up
    # to a single filename.
    with self._lock:
        self._seen_so_far += bytes_amount
        percentage = (self._seen_so_far / self._size) * 100
        sys.stdout.write(
            "\r%s  %s / %s  (%.2f%%)" % (
                self._filename, self._seen_so_far, self._size,
                percentage))
        sys.stdout.flush()

, класс используется для сохранения состояния, необходимого дляпоследующие вызовы (т.е. self.seen_so_far)

есть ли способ переопределить это как функцию, использующую преимущество закрытия Python для обеспечения сохранения состояния?

1 Ответ

0 голосов
/ 03 февраля 2019

Конечно, прямая транслитерация будет выглядеть примерно так:

def ProgressPrecentage(filename):
    size = os.path.getsize(filename)
    seen_so_far = 0
    lock = threading.Lock()
    def worker(bytes_amount):
        nonlocal seen_so_far
        with lock:
            seen_so_far += bytes_amount
            percentage = (seen_so_far / size)*100
            msg = "\r%s  %s / %s  (%.2f%%)" % (
                filename, seen_so_far, size, percentage
            )
            sys.stdout.write(msg)
            sys.stdout.flush()
    return worker
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...