Impossibilité de créer les paramètres de classe dynamiquement avec les descripteurs
The snippet can be accessed without any authentication.
Authored by
Françoise Conil
"""
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))
Please register or sign in to comment