功能纯度的继承如何工作?例如,我希望这段代码:
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')
行Out[154]
和Out[155]
产生相同的键,因为它正在从声明为pure的延迟实例访问属性。但是,它不是,并且强制执行纯度的唯一方法是明确声明它,如行[156]
和[157]
所示。
这引出了一个关于纯度如何被遗传的问题。是否有针对此的一般规则或故意未定义?
谢谢! : - )
编辑:此问题已移至here。解决后将发布更新。
编辑2:在[156]和[157]结束时移除了无关的pure=True
答案 0 :(得分:2)
来自docstring:
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
是一个错误的输入,但是因为它是假的)。调用结果对象每次都会产生相同的键,但对象本身不被认为是纯粹的。
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关于这个吗?