2017-03-13 8 views
1

機能純度の継承はどのように機能しますか?例えば、私は、このコードに期待する:それは遅延インスタンスから属性にアクセスしているので、ラインOut[154]Out[155]は、同じキーを得純度の継承

In [150]: myObj = delayed(dict,{}, pure=True) 

In [151]: myObj 
Out[151]: Delayed('dict-343cc4b6676839eb7fd74272cd0a1ed1') 

In [152]: myObj = delayed(dict,{}, pure=True) 

In [153]: myObj 
Out[153]: Delayed('dict-343cc4b6676839eb7fd74272cd0a1ed1') 

In [154]: myObj.foo 
Out[154]: Delayed('getattr-e1ffa164-8c0e-40ac-9e84-2dc2ed334f93') 

In [155]: myObj.foo 
Out[155]: Delayed('getattr-c0b9af63-2145-498a-979b-cdfb8e6a30a9') 

In [156]: delayed(getattr,pure=True)(myObj, 'foo') 
Out[156]: Delayed('getattr-5f98e6d14b9694ba16542b61a770d0f0') 

In [157]: delayed(getattr,pure=True)(myObj, 'foo') 
Out[157]: Delayed('getattr-5f98e6d14b9694ba16542b61a770d0f0') 

は純粋に宣言しました。しかし、そうではなく、純粋に実施する唯一の方法は、[156][157]のように、明示的に宣言することです。

これは、純度がどのように受け継がれているかという質問につながります。これに関する一般的な規則はありますか?これは意図的に未定義ですか?

ありがとうございました! :-)

編集:この質問はhereに移動しました。解決されると、更新が掲示されます。

EDIT 2:[156]の終わりにpure=True外来を除去し、[157]

答えて

2

ドキュメント文字列から:上記のコードで

pure : bool, optional 
    Indicates whether calling the resulting ``Delayed`` object is a pure 
    operation. If True, arguments to the call are hashed to produce 
    deterministic keys. Default is False. 

、あなたが効果的に(純粋な関数dictを宣言しています{}nameとして渡されますが、誤って入力されていますが、false-yだから機能します。結果のオブジェクトを呼び出すと毎回同じキーが返されますが、オブジェクト自体は純粋ではありません。遅れたオブジェクト上の

In [1]: from dask import delayed 

In [2]: f = delayed(dict, pure=True) 

In [3]: f(a=1, b=2) 
Out[3]: Delayed('dict-33dc94312cd726f892eba4af7af52947') 

In [4]: f(a=1, b=2) # same key 
Out[4]: Delayed('dict-33dc94312cd726f892eba4af7af52947') 

In [5]: f.a 
Out[5]: Delayed('getattr-e297bc1b-faef-4d0a-a2d6-99d1232065f1') 

In [6]: f.a # not the same key 
Out[6]: Delayed('getattr-12bbbf19-fe91-4075-8992-2ebb63b391e9') 

方法もpureキーワードで純粋として指定することができますが、もちろんそれは、属性では動作しません。これは、もともと遅延インタフェースを記述していたときに考慮されたものではありません。

In [7]: f.foo(a=1, pure=True) 
Out[7]: Delayed('foo-b50c25f3e4249b9bd33a1e07975c9c27') 

In [8]: f.foo(a=1, pure=True) # same key 
Out[8]: Delayed('foo-b50c25f3e4249b9bd33a1e07975c9c27') 

私はこれがどのように動作するかを変更すること、およびdelayed(object, pure=True)をさせるために開いていると思いますが、すべてのメソッドと属性のアクセスが純粋として扱われることを示しています。 githubアカウントをお持ちの場合、open an issueこれについては?

+0

いいね、そこに投稿しました、ありがとう! :-) – julienl