在dask.bag中改变对象

时间:2018-03-27 19:10:51

标签: python dask

我正在尝试使用dask.bag来保存给定类的对象,其中每个实例捕获文档的各种属性(标题,wordcount等)。

此对象具有一些设置对象的不同属性的相关方法。

例如:

import dask.bag as db

class Item:    
    def __init__(self, value):
        self.value = 'My value is: "{}"'.format(value)        
    def modify(self):
        self.value = 'My value used to be: "{}"'.format(self.value)

def generateItems():
    i = 1
    while i <= 100:
        yield(Item(i))
        i += 1

b = db.from_sequence(generateItems())
# looks like:
b.take(1)[0].value #'My value is: "1"'

如何在第一个包(modify)中创建每个b -d实例的包?

所需的输出:'My value used to be: "My value is: "1""'等。

我试过了:

c = b.map(lambda x: x.modify() )

c.take(1)[0].value 
#AttributeError: 'NoneType' object has no attribute 'value'

# Also tried:
d = b.map(lambda x: x[0].modify() )    
b.take(1) # TypeError: 'Item' object does not support indexing

1 个答案:

答案 0 :(得分:2)

此处的问题是c获得了运行lambda函数的结果,而Item.modify()没有输出。通常在Dask中,您希望根据输入返回新对象,而不是改变现有对象How does dask.delayed handle mutable inputs? - 考虑如果多个任务在多个线程或多个进程中对同一对象进行操作会发生什么。

在这个最简单的情况下,您可以通过将return self添加到mutate()的末尾,或将lambda表达式更改为x.mutate() and x来获得所需内容。但是DON&#T; T以这种方式编程,改为创建一个具有所需新值的新对象。