Astropy: Spinner の古いドキュメント

作成日 2020年11月08日  ·  3コメント  ·  ソース: astropy/astropy

説明

Spinnerクラスの現在の docstring は、 s.next()を使用してスピナーを更新する方法を示しています。 しかし、これは Python 2 主義であり、Python 3 のイテレータにはもはや存在しません。代わりに、正しいドキュメントはnext(s)です。

さらに、 Spinnerの API がProgressBarProgressBarOrSpinnerと大きく異なるのは紛らわしいと思います。 後者の 2 つのケースでは、 __enter__メソッド ( with ProgressBar(...) as bar:を使用する場合、それ自体が反復可能であるProgressBar(OrSpinner)インスタンス自体を返します。また、 update()メソッドも提供します。 with Spinner(...) as s:Spinnerインスタンス自体を返しませんが、ジェネレーターを返します。

Spinnerの API を更新するのは簡単です (反復可能にし、 __enter__Spinnerインスタンスを返し、 update()メソッドを追加します)。 ProgressBar似ています。

Spinnerの更新とドキュメントの修正を同時に行うことをお勧めします。

API change Bug Docs Effort-low Package-novice Priority-Low good first issue utils

全てのコメント3件

やってる

そう。 スピナーを反復可能にすると、停止条件がなくなります。 したがって、ユーザーが冒険的なループ (以下のような) を行うことにした場合、今日は宇宙に行きません。

for s in console.Spinner("Reticulating splines", file=stream, chars=chars):
        foo_bar()

ジェネレーターをupdate()関数に書き直したほうがよいのではないでしょうか ( __enter__ __exit__メソッドはそのままにしておきます)。 または、このユースケースについて心配する必要はありません。

これは良い点であり、 SpinnerProgressBar間の別の矛盾を明らかにします。後者は長さ/イテレータを引数として取ることができます。 プログレス バーは作業量がわかっているものに向いているのに対して、スピナーは作業量が不明な場合に適しているため、これは理にかなっています。 イテレータは有限でない場合もありますが、そのようなイテレータをスピナーにラップすると便利です。

とはいえ、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)
  • ドキュメントの例を更新する
このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

simontorres picture simontorres  ·  3コメント

pllim picture pllim  ·  3コメント

JWDobken picture JWDobken  ·  3コメント

Gabriel-p picture Gabriel-p  ·  3コメント

bmorris3 picture bmorris3  ·  3コメント