Подтвердить что ты не робот

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

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

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

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

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

NameError: name 'self' is not defined

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

4b9b3361

Ответ 1

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

class Example(object): #inherit from object.  It 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 в качестве осмысленного аргумента для ваших методов, я бы рекомендовал использовать это.