如何在默认为类级别值的Python方法中使用命名参数?

sor*_*rin 5 python named-parameters

使用场景:

# case #1 - for classes
a = MyClass() # default logger is None
a = MyClass(logger="a") # set the default logger to be "a"
a.test(logger="b") # this means that logger will be "b" only inside this method
a.test(logger=None) # this means that logger will be None but only inside this method
a.test() # here logger should defaults to the value specified when object was initialized ("a")
Run Code Online (Sandbox Code Playgroud)

我如何实现MyClass以便能够如上所述使用它?

让我们假设我有几个方法MyClass可以接受logger命名参数,所以我希望一个解决方案不需要在每个test...()方法的开头添加大量重复代码.

我读到了关于sentinel的例子,但这不适用于类,我不想添加一个全局变量来保存sentinel对象.

Ale*_*lli 9

_sentinel = object()

class MyClass(object):
  def __init__(self, logger=None):
    self.logger = logger
  def test(self, logger=_sentinel):
    if logger is _sentinel: logger = self.logger

# in case you want to use this inside a function from your module use:
_sentinel = object()
logger = None
def test(logger=_sentinel)
    if logger is _sentinel: logger = globals().get('logger')
Run Code Online (Sandbox Code Playgroud)

两个核心思想:捕获可能(或可能不是)在本地覆盖到关键字参数dict的命名值集合; 使用sentinel对象作为默认值来唯一地标识某个命名参数是否已被显式传递(None通常用于此目的,但是,当您在此处想要None作为参数的"第一类值"时,独特的哨兵对象也会这样做.