Невозможно вызвать метод, если он не является глобальным из класса

Привет, я новичок в 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.

(Кроме того, почему название вашего вопроса не связано с реальным вопросом?)

Другие вопросы по тегам