先物を使ったタプルアンパックのようなものを実現するための寛大な/慣用的な方法は何ですか?python先物とタプルのアンパック
私は
a, b, c = f(x)
y = g(a, b)
z = h(y, c)
のようなコードがあると私は先物を使用するように変換したいと思います。 理想的には私が
a, b, c = ex.submit(f, x)
y = ex.submit(g, a, b)
z = ex.submit(h, y, c)
のようなものを書きたいというの最初の行は、しかし
TypeError: 'Future' object is not iterable
をスローします。 を3回追加することなくa,b,c
を取得するにはどうすればよいですか?すなわち、私はこれのように記述することを避けるためにたいと思います。たとえば、あなたならば最初:、
import operator as op
fut = ex.submit(f, x)
a = client.submit(op.getitem, fut, 0)
b = client.submit(op.getitem, fut, i)
c = client.submit(op.getitem, fut, 2)
y = ex.submit(g, a, b)
z = ex.submit(h, y, c)
私は潜在的な解決策は、以下のようなunpack
関数を記述することであると思い働く
import operator as op
def unpack(fut, n):
return [client.submit(op.getitem, fut, i) for i in range(n)]
a, b, c = unpack(ex.submit(f, x), 3)
y = ex.submit(g, a, b)
z = ex.submit(h, y, c)
定義:
def f(x):
return range(x, x+3)
x = 5
g = op.add
h = op.mul
を、あなたが
を取得z.result() #===> 77
私はこれがすでに存在するかもしれないと考えました。
上記は、dask.distributed.Future
でのみ動作します。プレーンでは動作しませんconcurrent.futures.Future
で
する "エラーをスローします。"何がエラーですか? –
@JohnZwinck 'TypeError: '未来'のオブジェクトは反復可能ではない' –
'operator.itemgetter'は複数の項目を取得できます。しかし、そのコードを見てください。これは反復を行うクラスです。 – hpaulj