python3:ビルトイン機能「マップ」はバグを持っていますか?

Takuo Matsuoka :

以下の私は(MacOSのモハーベ、10.14.6に、だけでなく、いくつかの他のプラットフォーム上のPython 3.7(または一部の古い))のPython 3.8.1としていました。私は、コンピューティングへの新たなんだと言語の改善を要求するのか分からないが、私は組み込み関数の奇妙な行動を見つけたと思いますmap

コードとしてnext(iter(()))昇給StopIteration、私が取得することが予想StopIteration以下のコードから:

tuple(map(next, [iter(())]))

驚いたことに、これは黙ってタプルを返されました()

それはマップオブジェクトの開梱表示されるようにするときに停止StopIterationから来たnextイテレータは、によって返され、「空」を押しますiter(())しかし、私は例外が右に処理されたとは思わない、などのStopIterationイテレータは(でヒットするには、リストから選ばれた「空」の前に提起されませんでしたnext)。

  1. 私は正しく動作を理解しましたか?
  2. この動作は何とか意図していますか?
  3. これは、近い将来に変更されますか?またはどのように私はそれを得ることができますか?

編集:私は、このようなことによってなど、さまざまな方法でマップオブジェクトを展開した場合の動作は似ているlistリスト内開梱、forループのために、によって、関数の引数のための開梱、setdict私は信じているので、そうではありませんtupleが、mapそれは間違っているのです。

編集:実際には、Pythonの2(2.7.10)、 "同じ"コード昇給におけるStopIteration私は、これは望ましい結果(点を除いてだと思いますmap。この場合の反復子を返しません)。

user2357112はモニカをサポートしています。

これがないmapバグ。これは、制御フローの例外に依存するPythonの決断の醜い結果だ:実際のエラーは、通常の制御の流れのように見えます。

ときにmap呼び出すnextiter(())next昇給StopIterationこのStopIteration伝播するの外map.__next__と内tupleのコール。このStopIterationように見えるStopIterationことmap.__next__は通常、マップの終わりを知らせるために引き上げるのでtupleマップは、単に要素の外にあると思います。

あなたが見たものよりも奇妙な結果にこのリード。たとえば、mapマップされた関数は例外を送出したときに、イテレータ自身をマークしませんが枯渇するので、あなたも、後でそれを反復保つことができます。

m = map(next, [iter([]), iter([1])])

print(tuple(m))
print(tuple(m))

出力:

()
(1,)

(CPythonとのmap実装では、実際に疲れ自体をマークする方法がありません-それは、そのために)基本的なイテレータ(Sに依存しています。)

呼び出すとStopIterationのこの種の問題は、彼らが実際にその迷惑な十分だった変更、それを緩和するために、発電機を呼び出すとStopIteration処理を。呼び出すとStopIterationは、発電機のうち、正常に伝播するために使用されるが、呼び出すとStopIterationが発電機から出て伝播するならば、それは正常に終了した発電機のように見えないように、今、それは例外RuntimeErrorに置き換えられます。これはしかし、他のではないイテレータが好き、発電機に影響を与えますmap

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=365265&siteId=1