Spinnerクラスの現在の docstring は、 s.next()
を使用してスピナーを更新する方法を示しています。 しかし、これは Python 2 主義であり、Python 3 のイテレータにはもはや存在しません。代わりに、正しいドキュメントはnext(s)
です。
さらに、 Spinner
の API がProgressBar
やProgressBarOrSpinner
と大きく異なるのは紛らわしいと思います。 後者の 2 つのケースでは、 __enter__
メソッド ( with ProgressBar(...) as bar:
を使用する場合、それ自体が反復可能であるProgressBar(OrSpinner)
インスタンス自体を返します。また、 update()
メソッドも提供します。 with Spinner(...) as s:
はSpinner
インスタンス自体を返しませんが、ジェネレーターを返します。
Spinner
の API を更新するのは簡単です (反復可能にし、 __enter__
でSpinner
インスタンスを返し、 update()
メソッドを追加します)。 ProgressBar
似ています。
Spinner
の更新とドキュメントの修正を同時に行うことをお勧めします。
やってる
そう。 スピナーを反復可能にすると、停止条件がなくなります。 したがって、ユーザーが冒険的なループ (以下のような) を行うことにした場合、今日は宇宙に行きません。
for s in console.Spinner("Reticulating splines", file=stream, chars=chars):
foo_bar()
ジェネレーターをupdate()関数に書き直したほうがよいのではないでしょうか ( __enter__
__exit__
メソッドはそのままにしておきます)。 または、このユースケースについて心配する必要はありません。
これは良い点であり、 Spinner
とProgressBar
間の別の矛盾を明らかにします。後者は長さ/イテレータを引数として取ることができます。 プログレス バーは作業量がわかっているものに向いているのに対して、スピナーは作業量が不明な場合に適しているため、これは理にかなっています。 イテレータは有限でない場合もありますが、そのようなイテレータをスピナーにラップすると便利です。
とはいえ、for ループの例はまだ役に立ちます (ただし、次のように、完了時にスピナーを適切にキャンセルするためにwith
ステートメントでも使用されます。
with Spinner('message') as spin:
for _ in spin:
# do stuff
break
これは、ループ中にスピナーを更新することを除いて、最終的にbreak
からwhile True:
ループを持つことと同じです。
一方持つupdate()
メソッドは、単に呼び出すことに相当しますnext(spinner)
。
基本的に、これは次の問題です。
Spinner.__init__
変更して、 self._iter = self._iterator()
(またはself._silent_iterator
)__enter__
をreturn self
だけに変更し、同じことを行う__iter__
も追加します ( return self
)next(self._iter)
がかかる__next__
を追加しますupdate()
呼び出すnext(self)