装饰器-进度条-《Python教程》

admin 2025-10-20 00:49:28 编程 来源:ZONE.CI 全球网 0 阅读模式

本篇文章介绍airbus中进度条装饰器,对于有循环次数的函数,可以使用该装饰器来比整个任务添加一个进度条监控。

1. 源码

  1. from functools import wraps
  2. from inspect import isgenerator
  3. from typing import Text
  4. from rich.panel import Panel
  5. from rich.progress import Progress, BarColumn, SpinnerColumn, TimeRemainingColumn, TimeElapsedColumn
  6. class RichProgress(Progress):
  7. def get_renderables(self):
  8. yield Panel(self.make_tasks_table(self.tasks), title="⌛ Progress Frame", expand=False)
  9. def progressbar(func):
  10. """Add a progress bar decorator for generator function to display in the terminal"""
  11. @wraps(func)
  12. def wrapper(*args, **kwargs):
  13. func_generator = func(*args, **kwargs)
  14. if not isgenerator(func_generator):
  15. raise Exception(f"{func.__name__} is not a generator function!")
  16. total = next(func_generator)
  17. with RichProgress(
  18. "[progress.description]{task.description}({task.completed}/{task.total})",
  19. SpinnerColumn(finished_text="🚀"),
  20. BarColumn(),
  21. "[progress.percentage]{task.percentage:>3.2f}%",
  22. SpinnerColumn(spinner_name="clock", finished_text="🕐"),
  23. TimeElapsedColumn(),
  24. "⏳",
  25. TimeRemainingColumn()) as progress:
  26. description = "[red]Loading"
  27. task = progress.add_task(description, total=total)
  28. try:
  29. while True:
  30. p = next(func_generator)
  31. if p != total:
  32. description = "[red]Loading"
  33. else:
  34. description = "[green]Finished"
  35. progress.update(task, completed=p, description=description)
  36. except StopIteration as result:
  37. return result.value
  38. return wrapper

2. 使用方法

如果需要使用进度条装饰器的话,需要所修饰的函数为生成器函数,并且yield返回第一个值为循环次数:

  1. import time
  2. from airbus.decorators import progressbar
  3. @progressbar
  4. def dummy_loop():
  5. total = 20
  6. yield total
  7. for i in range(1, total + 1):
  8. yield i
  9. time.sleep(1)
  10. return "done"
  11. print(dummy_loop())
以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  10