Skip to content
Snippets Groups Projects

Impossibilité de créer les paramètres de classe dynamiquement avec les descripteurs

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Françoise Conil
    descriptors_sms_config-1-ko.py 2.42 KiB
    """
    https://docs.python.org/3/library/functions.html?highlight=property#property
    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 logging
    import os
    
    logging.basicConfig(level=logging.INFO)
    
    # Class variable : (parameter name, environment variable, description, defaut value)
    DEFAULTS = {
            'NAME': ('name', 'HTTP_FETCHER_NAME', 'Name of the acquisition', None),
            'MODE': ('mode', 'HTTP_FETCHER_MODE', 'http method', 'GET'),
            'URL': ('url', 'HTTP_FETCHER_URL', 'URL to fetch', None),
            'DELAY': ('delay', 'HTTP_FETCHER_DELAY', 'Delay between requests in seconds', 3600),
            'FORMAT': ('format', 'HTTP_FETCHER_FORMAT', 'File format', 'json'),
            'MAXITEMS': ('maxitems', 'HTTP_FETCHER_MAXITEMS', 'Max number of fetches', -1)
            }
    
    
    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)
    
    
    def define_config_parameters(cls):
    
        # https://stackoverflow.com/questions/2583620/dynamically-create-class-attributes
    
        for name, value in DEFAULTS.items():
            setattr(cls, name, ConfigParameter())
    
        return cls
    
    
    @define_config_parameters
    class Config:
    
        def __init__(self, **kwargs):
            for param, value in kwargs.items():
                setattr(self, param, value)
    
    
    if __name__ == "__main__":
        print(f"vars(Config) = {vars(Config)}")
    
        for param in DEFAULTS.keys():
            print(f"vars(vars(Config)[{param}]) = {vars(vars(Config)[param])}")
    
        config_params = {}
        for k, v in DEFAULTS.items():
            config_params[k] = v[-1]
    
        print(f"config_params = {config_params}")
    
        c = Config(**config_params)
    
        for param in DEFAULTS.keys():
            print(f"vars(vars(Config)[{param}]) = {vars(vars(Config)[param])}")
    
        print(vars(c))
    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