печать точек с помощью декоратора во время выполнения функции - PullRequest
0 голосов
/ 12 июля 2020

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

import sys
from time import sleep


def call_counter(func):
    def helper(*args, **kwargs):
        for dot in xrange(0, 99):
            sys.stdout.write(".")
            sys.stdout.flush()
        return func(*args, **kwargs)
    helper.calls = 0
    helper.__name__= func.__name__
    return helper

@call_counter
def f():
    sleep(10)



if __name__ == "__main__":
    f()

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

1 Ответ

0 голосов
/ 12 июля 2020

Независимо от того, используете ли вы декораторы или нет, вы не можете волшебным образом распечатать ход выполнения функции, если эта функция не будет добровольно сообщать о своем прогрессе. Отчет о ходе выполнения обычно осуществляется путем передачи функции обратного вызова progress . Функция будет, например, на каждой итерации внутреннего l oop (при условии, что у него есть какой-то l oop) выполнять обратный вызов пользователя и передавать параметр, обозначающий ее текущий прогресс. что-то вроде

def long_func(data:list, progress):
tot = len(data)
for i,item in enumerate(data):
   #do something with item
   progress(i+1/tot)
...