Инициализировать параметр метода значением по умолчанию
Я хотел бы инициализировать параметр метода некоторым значением по умолчанию, если явное значение не было передано в метод - что-то вроде этого:
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
как значимый аргумент в пользу ваших методов, я бы рекомендовал использовать это.