python: что возвращает метод, если то, что он делает, просто вызывает ошибку?

#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
 
  1. Почему self.generic_visit не имеет параметров?
  2. что еще более важно, 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 .