除非它的全局来自一个类,否则无法调用方法

时间:2012-08-30 06:18:59

标签: python disco

您好我是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更改为全局函数,它将按预期正常工作。 但是我仍然需要找到一种方法使它作为类函数工作,有没有办法 做到了吗?

谢谢,

钱德勒

2 个答案:

答案 0 :(得分:0)

您似乎想要使用self.map_funself.reduce_fun。在Python中,它们的裸名称无法访问对象的方法;你必须使用self。您还需要为这些方法提供self参数。您应该阅读the Python tutorial以熟悉Python中的类和方法的基础知识。

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

答案 1 :(得分: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_......"])

请注意,您无法访问map_fun和reduce_fun中的self,这就是params存在的原因。另请注意,Job.run现在为self.runSegmenter扩展为Job