您好我是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更改为全局函数,它将按预期正常工作。 但是我仍然需要找到一种方法使它作为类函数工作,有没有办法 做到了吗?
谢谢,
钱德勒
答案 0 :(得分:0)
您似乎想要使用self.map_fun
和self.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.run
,Segmenter
扩展为Job
。