Инициализировать параметр метода значением по умолчанию

Я хотел бы инициализировать параметр метода некоторым значением по умолчанию, если явное значение не было передано в метод - что-то вроде этого:

class Example
   def __init__(self, data = self.default_data()):
      self.data = data

   def default_data():
      # ....
      return something

Я получил ошибку:

NameError: name 'self' is not defined

Как это исправить?

1 ответ

Решение

Распространенная идиома здесь - установить значение по умолчанию для некоторого значения часового типа (None типично, хотя некоторые предложилиEllipsis для этого), который вы можете проверить.

class Example(object): #inherit from object.  It's just a good idea.
   def __init__(self, data = None):
      self.data = self.default_data() if data is None else data

   def default_data(self):  #probably need `self` here, unless this is a @staticmethod ...
      # ....
      return something

Вы также можете увидеть экземпляр object() используется для дозорного

SENTINEL = object()
class Example(object):
   def __init__(self, data = SENTINEL):
      self.data = self.default_data() if data is SENTINEL else data

Эта последняя версия имеет то преимущество, что вы можете пройти None к вашей функции, но имеет несколько недостатков (см. комментарии @larsmans ниже). Если вы не предвидите необходимость пройти None как значимый аргумент в пользу ваших методов, я бы рекомендовал использовать это.

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