How to use named parameters in Python methods that default to class level value?

Usage scenario:

# 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")

How can I implement MyClassto be able to use it as above?

Suppose I have several methods inside MyClassthat can take a loggernamed parameter , so I would appreciate a solution that does not require adding a lot of duplicate code at the beginning of each method test...().

I read about the sentinel example , but this does not work for classes, and I would not want to add a global variable to keep the sentinel object inside.

+5
source share
3
_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')

: , ( ) keywords-parameters dict; - , , (None , , , None " " - ).

+9
class MyClass(object):    
    def __init__(self, logger=None):
        self.logger = logger
    def test(self, **kwargs):
        logger = kwargs.get("logger", self.logger)
        # use logger, which is sourced as given in OP

  • **kwargs , None MyClass.test. , ( None ).
  • , . , , , MyClass None, MyClass.
+3
class MyClass(object):
    def __init__(self, logger = None):
        self.logger = logger

    def test(self, **kwargs):
        logger = self.logger            
        if kwargs.has_key("logger"):
            logger = kwargs.get(logger)
        print "logger is %s" logger.name

: test , . , , . logger = None , .

+1

All Articles