0

嗨,我是 Disco 的新手,并将现有代码集成到其中。Disco 是否能够将 map/reduce 函数作为类中的函数而不是全局函数来调用?下面的代码可能解释得更清楚。

class Segmenter(object):
    def map_fun(line, params):
        ....
    def reduce_fun(iter, params):
        ....
    def disco_mp(self):
        job = Job().run(input=["raw://word_to_segment_......"],
                        map=map_fun,
                        reduce=reduce_fun)
        ...

执行的结果是

NameError: global name 'map_fun' is not defined

但是,如果我将 map_fun、reduce_fun 更改为全局函数,它会按预期工作。但是我仍然必须找到一种方法让它作为类函数工作,有什么办法吗?

谢谢,

钱德勒

4

2 回答 2

0

看起来您想使用self.map_funand self.reduce_fun。在 Python 中,对象的方法不能通过它们的裸名访问;你必须使用self. 您还需要为self这些方法提供参数。您应该阅读Python 教程以熟悉 Python 中的类和方法的基础知识。

(另外,为什么您的问题的标题与实际问题无关?)

于 2012-08-30T06:21:41.380 回答
0

你需要静态方法,你可以用装饰器做到这一点:

class Segmenter(Job):
    map = staticmethod(map_fun)
    reduce = staticmethod(reduce_fun)

    @staticmethod
    def map_fun(line, params):
        ....

    @staticmethod
    def reduce_fun(iter, params):
        ....

    def disco_mp(self):
        job = self.run(input=["raw://word_to_segment_......"])

请注意,您将无法同时访问selfmap_fun 和 reduce_fun,这就是params存在的原因。还要注意Job.runis nowself.runSegmenterextends Job

于 2012-08-30T13:34:39.523 回答