Невозможно вызвать метод, если он не является глобальным из класса
Привет, я новичок в Disco и интегрирую в него существующий код. Способна ли Disco вызывать функцию map / Reduction как функцию внутри класса вместо глобальной функции? Следующий код может объяснить более четко.
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, redu_fun на глобальную функцию, она будет работать нормально, как и ожидалось. Однако мне все еще нужно найти способ заставить его работать как функции класса, есть ли способ сделать это?
Спасибо,
лавочник
2 ответа
Вам нужен статический метод, вы можете сделать это с помощью декоратора:
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_......"])
Обратите внимание, что у вас не будет доступа к self
в обоих map_fun и redu_fun, и именно поэтому params
существует. Также обратите внимание, что Job.run
сейчас self.run
а также Segmenter
продолжается Job
,
Похоже, вы хотите использовать self.map_fun
а также self.reduce_fun
, Методы объектов не могут быть доступны по их голым именам в Python; ты должен использовать self
, Вам также нужно будет предоставить self
аргумент в пользу этих методов. Вы должны прочитать руководство по Python, чтобы ознакомиться с основами классов и методов в Python.
(Кроме того, почему название вашего вопроса не связано с реальным вопросом?)