Есть ли способ запустить список функций в методе из другого метода, пропуская одну указанную функцию в списке?
Например, у меня есть метод 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
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
В зависимости от вашей области вы можете временно изменить определение функции перед ее выполнением.
Глобальный охват
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
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.