#python #runtime-error #visitor-pattern
#python #ошибка во время выполнения #посетитель-шаблон
Вопрос:
Следующий фрагмент кода взят из python cook book, 3-е изд. Глава 8.21:
class NodeVisitor:
def visit(self, node):
methname = 'visit_' type(node).__name__
meth = getattr(self, methname, None)
if meth is None:
meth = self.generic_visit # this is the line that I have problem with
return meth(node)
def generic_visit(self, node):
raise RuntimeError('No {} method'.format('visit_' type(node).__name__))
Поскольку я комментирую код, у меня есть два вопроса по поводу этой строки:
meth = self.generic_visit # this is the line that I have problem with
- Почему self.generic_visit не имеет параметров?
- что еще более важно, generic_visit ничего не делает, кроме как вызывает ошибку RuntimeError, почему он возвращает что-то и присваивает «meth»?
Комментарии:
1. Код упрощается до:
return getattr(self, methname, 'generic_visit')(node)
. Суть которого такова: вызовитеself.<methname>(node)
, если он существует, в противном случае вызовитеself.generic_visit(node)
. Предположительно, последний метод потенциально может быть использован в другом месте класса или повторно реализован подклассами. Однако пример был бы понятнее, если бы он просто вызывал ошибку непосредственно вvist
методе.
Ответ №1:
meth = self.generic_visit
делает meth
ссылку на сам метод self.generic_visit
. Это не относится к его возвращаемому значению; это было бы получено путем вызова meth(x)
some x
.