Есть ли способ запустить список функций в методе из другого метода, пропуская одну указанную функцию в списке?

Например, у меня есть метод contentList:

def contentList(self):  
    methods = [self.title, self.containerDIV, self.heading, self.stopSection, self.offlineSection, self.onlineSection, self.endDIV, self.otherImages]
    for m in methods:
        m()
def test(self):
    self.contentList()
    # skip over stopSection

Есть ли способ запустить эти методы из метода испытаний, пропуская или не запуская self.stopSection?

ОБНОВЛЕНИЕ

Вот больше о том, что я пытаюсь:

#**************************** BEGIN OF HTML CONTENT ****************************

    def title(self):
        self.wfile.write(bytes("<div id='title'><img src='../images/title.png'></div>", "utf8"))

    def containerDIV(self):
        self.wfile.write(bytes("<div id='container'", "utf8"))

    def endDIV(self):
        self.wfile.write(bytes("</div>", "utf8"))

#**************************** END OF HTML CONTENT ****************************

    def contentList(self, skip_name):  # All content functions in list 
        methods = [self.title, self.containerDIV, self.endDIV]
        for m in methods:
            if m.__name__ != skip_name:
                m()


    def narrow(self):
        try:
            self.contentList('title')   # removed title
            return          

    # GET
    def do_GET(self):
        try:
            self.contentList('none')  # I added none here because I want to keep title
            return
1
Kade Williams 14 Мар 2018 в 08:00

2 ответа

Лучший ответ

Вы можете проверить имя функции по ее атрибуту __name__. Итак, в вашем случае вы можете сделать что-то вроде:

class SomeClass:
    def contentList(self, skip_method_name):  
        methods = [self.title, self.containerDIV, self.heading, self.stopSection, self.offlineSection, self.onlineSection, self.endDIV, self.otherImages]
        for m in methods:
            if m.__name__ != skip_method_name:
                m()

    def test(self):
        self.contentList('stopSection')

Позвольте мне привести более краткий пример

class SomeClass:
    def method_a(self):
        print('method_a')

    def method_b(self):
        print('method_b')

    def method_runner(self, skip_name):
        for m in [self.method_a, self.method_b]:
            if m.__name__ != skip_name:
                m()

Пример использования:

>>> some_obj = SomeClass()
>>> some_obj.method_runner('')
method_a
method_b
>>> some_obj.method_runner('method_a')
method_b
>>> some_obj.method_runner('method_b')
method_a

Как указывал @Jeronimo, мы можем использовать фактическую функцию в методе method_runner и вообще обойти вызов __name__. Используя этот подход, мой пример выглядит так:

class SomeClass:
    def method_a(self):
        print('method_a')

    def method_b(self):
        print('method_b')

    def method_runner(self, skip_method):
        for m in [self.method_a, self.method_b]:
            if m != skip_method:
                m()

Пример использования:

>>> some_obj = SomeClass()
>>> some_obj.method_runner(None)
method_a
method_b
>>> some_obj.method_runner(some_obj.method_a)
method_b
>>> some_obj.method_runner(some_obj.method_b)
method_a
1
bla 14 Мар 2018 в 12:33

В зависимости от вашей области вы можете временно изменить определение функции перед ее выполнением.

Глобальный охват

    def t1():
        print('t1')

    def t2():
        print('t2')

    def contentList():
        methods = [t1, t2]
        for m in methods:
            m()
    def test():
        global t1
        def fake(): pass

        temp = t1
        t1 = fake
        contentList()
        t1 = temp

    test()

Область классов

def test(self):
    def fake(): pass
    temp = self.stopSection
    self.stopSection = fake
    self.contentList()
    self.stopSection = temp
2
Joseph M 14 Мар 2018 в 05:13