I am writing an object-oriented app to help our developers manage some cloud systems. I’d like to make the configuration information available to all the classes, but I’m not sure of a good way to do that. Everything I can think of seems to fall under the category of “global variables” which as far as I know is a Very Bad Thing.

I already have a logging Mixin class that enables logging for every class that inherits it, and I was wondering if that’s the right way to approach the configuration data:

class LoggingMixin:
    @classmethod
    @property
    def log(cls):
        return logging.getLogger(cls.__name__)

class TestClassA(LoggingMixin):
    def testmethod1(self):
        self.log.debug("debug message from test class A")

if __name__ == "__main__":
    logging.basicConfig(
        format="{created:<f} {levelname:>5s} {name}.{funcName:>8s} |{message}|",
        level=logging.DEBUG,
        style="{",
    )

    a = TestClassA()
    a.testmethod1()

Outputs (in case you are curious)

1688494741.449282 DEBUG TestClassA.testmethod1 |debug message from test class A|

What’s a good way of making data from a class available to all classes/objects? It wouldn’t be static, it’d be combined from a JSON file and any command line parameters.

If I copied the example above but changed it to a ConfigMixin, would that work? With the logging example, each class creates its own logger object when it first calls self.log.debug, so that might not work because each object needs to get the same config data.

Is there a pattern or other design that could help? How do you make configuration data available to your whole app? Do you have a config object that can get/set values and saves to disk, etc?

Thank you for reading, my apologies for poorly worded questions.

  • thedeepself
    link
    fedilink
    English
    arrow-up
    2
    arrow-down
    1
    ·
    1 year ago

    You need traitlets yesterday. It comes with a logging attribute and has extensive support for configuration - via command-line, or config files or python oop.

    • bloopernovaOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      1 year ago

      Ok now those look really useful! You are an excellent person and I appreciate you.

    • bloopernovaOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      1 year ago

      Hey, I implemented the config system using traitlets and it works great! Thank you again!