Skip to content
Snippets Groups Projects

Class Config with descriptor

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Françoise Conil
    descriptors_sms_config.py 3.07 KiB
    """
    https://docs.python.org/3/howto/descriptor.html
    https://docs.python.org/3/reference/datamodel.html#implementing-descriptors
    
    Non utilise finalement
    https://stackoverflow.com/questions/1325673/how-to-add-property-to-a-class-dynamically
    """
    
    import collections
    import logging
    import os
    
    logging.basicConfig(level=logging.INFO)
    
    class ConfigParameter:
    
        def __set_name__(self, owner, name):
            """Called at the time the owning class "owner" is created.
            The descriptor has been assigned to "name".
    
            https://docs.python.org/3/reference/datamodel.html#object.__set_name__
            """
            self.public_name = name
            self.private_name = f'_{name}'
    
        def __get__(self, obj, objtype=None):
            """
            """
            value = getattr(obj, self.private_name)
            logging.info('Accessing %r giving %r', self.public_name, value)
            return value
    
        def __set__(self, obj, value):
            logging.info('Updating %r to %r', self.public_name, value)
            setattr(obj, self.private_name, value)
    
    
    class Config:
    
        name = ConfigParameter()
        mode = ConfigParameter()
        url = ConfigParameter()
        delay = ConfigParameter()
        # format is not a Python keyword, https://docs.python.org/3.8/reference/lexical_analysis.html#keywords
        format = ConfigParameter()
        maxitems = ConfigParameter()
    
        def __init__(self, defaults):
            self.name = os.environ.get(defaults['name'].envvar, defaults['name'].default)
            self.mode = os.environ.get(defaults['mode'].envvar, defaults['mode'].default)
            self.url = os.environ.get(defaults['url'].envvar, defaults['url'].default)
            self.delay = os.environ.get(defaults['delay'].envvar, defaults['delay'].default)
            self.format = os.environ.get(defaults['format'].envvar, defaults['format'].default)
            self.maxitems = os.environ.get(defaults['maxitems'].envvar, defaults['maxitems'].default)
    
    
    if __name__ == "__main__":
        # Using namedtuple to better manipulated defaults
        # https://docs.python.org/3.8/library/collections.html#collections.namedtuple
        # ---------------------------------------------------------------------------
        fparam = collections.namedtuple('FetcherParameters', ['name', 'envvar', 'description', 'default'])
    
        fetcher_defaults = {
                'name': fparam(name='name', envvar='HTTP_FETCHER_NAME', description='Name of the acquisition', default=None),
                'mode': fparam(name='mode', envvar='HTTP_FETCHER_MODE', description='http method', default='GET'),
                'url': fparam(name='url', envvar='HTTP_FETCHER_URL', description='URL to fetch', default=None),
                'delay': fparam(name='delay', envvar='HTTP_FETCHER_DELAY', description='Delay between requests in seconds', default=3600),
                'format': fparam(name='format', envvar='HTTP_FETCHER_FORMAT', description='File format', default='json'),
                'maxitems': fparam(name='maxitems', envvar='HTTP_FETCHER_MAXITEMS', description='Max number of fetches', default=-1)
                }
    
        print(f"vars(Config) = {vars(Config)}")
    
        c = Config(fetcher_defaults)
    
        print(vars(c))
    
        c.format = 'xml'
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment