2012-07-04 4 views
4

Делаю индикатор прогресса в течение некоторого затянувшегося процесса консоли с намерением использовать его как это:Является ли это допустимым вариантом использования для менеджера контекста?

pi = ProgressIndicator() 
for x in somelongstuff: 
    do stuff 
    pi.update() 
pi.print_totals() 

В основном, это должен вывести какой-то прогресс бар с точками и тире, и что-то вроде «234234 байта обработано» в конце.

Я думал, что было бы неплохо, чтобы использовать его в качестве контекста менеджера:

with ProgressIndicator() as pi: 
    for x in somelongstuff: 
     do stuff 
     pi.update() 

Однако есть несколько вещей, которые волнуют меня об этом решении:

  • дополнительные отступы делают функцию индикатора более важны, чем на самом деле
  • Я не хочу, чтобы ProgressIndicator обрабатывал любые исключения, которые могут возникнуть в цикле

Является ли это допустимым вариантом использования для менеджера контекста? Какие другие решения вы можете предложить?

ответ

3

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

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

2

Там есть приложение с графическим интерфейсом, который имеет очень похожий ProgressTask API, который вы используете, как это:

def slow_func(): 
    t = nuke.ProgressTask() 
    t.setMessage("Doing something") 
    for x in range(100): 
     do_something() 
     t.setProgress(x+1) 

Когда ProgressTask.__del__ называется, индикатор UI исчезает. Это хорошо работает по большей части, однако, если возникает исключение (например, do_something()), объект отслеживающий сохраняет ссылку на ProgressTask объекта, так что прогресс-бар застревает (до тех пор, пока происходит другой отслеживающий)

ProgressTask реализовал протокол контекст-менеджера, он мог использовать метод __exit__, чтобы гарантировать, что индикатор выполнения был скрыт.

Для пользовательского интерфейса командной строки (который звучит так, как будто вы пишете) это может не быть проблемой, но вы можете выполнять аналогичные задачи очистки, например, для отображения строки типа ######### 100% (error) и обеспечения вывода трассировки isn ' т перепутался т.д.,

Там нет причин, ваш класс прогресса-бар не может быть полезным в оба манере - большинство контекстных менеджеров вполне можно использовать как как обычные объекты и контекстно-менеджер, например:

lock = threading.Lock() 
lock.acquire() 
lock.release() 
# or: 
with lock: 
    pass 
Смежные вопросы