使用默认值初始化方法的参数

dem*_*mas 17 python

如果未将明确值传递给方法,我想用一些默认值初始化方法的参数 - 如下所示:

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

   def default_data():
      # ....
      return something
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

NameError: name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

mgi*_*son 23

这里常见的习惯用法是将默认值设置为某些哨兵值(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
Run Code Online (Sandbox Code Playgroud)

您可能还会看到object()用于哨兵的实例.

SENTINEL = object()
class Example(object):
   def __init__(self, data = SENTINEL):
      self.data = self.default_data() if data is SENTINEL else data
Run Code Online (Sandbox Code Playgroud)

后一个版本的好处是你可以传递None给你的函数,但有一些缺点(见下面@larsmans的评论).如果您不认为需要将None有意义的参数传递给您的方法,我会主张使用它.

  • 一个`object()`as sentinel有一个缺点,它在文档字符串中表现得非常难看,并且默认行为变得难以通过显式方式获得,因此传递`None`是通常的方法(在stdlib和其他大多数情况下)我知道的Python库). (2认同)