[IPython-dev] traitlets.config: common or global parameters?

G Jones glenn.caltech at gmail.com
Tue Feb 21 12:51:16 EST 2017


Hi Matthias,
Thanks for the reply; I think that makes sense.
It might also answer my next question too: Suppose I have another
application PipelineMonitor and I want to connect PipelineApp to
PipelineMonitor via a common socket. The question is how to share that
common socket information (i.e. port number) between the applications using
the config file. It sounds like the idea would be to do something like
common_configuration.py:
class GlobalConfiguration(configurable):
    common_port_number = Int(55555).tag(config=True)

pipeline.py:
from common_configuration import GlobalConfiguration
class PipelineConfiguration(GlobalConfiguration):
    common_dir = Unicode('').tag(config=True)

pipeline_monitor.py:
from common_configuration import GlobalConfiguration
class PipelineMonitorConfiguration(GlobalCOnfiguration):
    some_param = Int(34).tag(config=True)

and then inherit PipelineConfiguration and PipelineMonitorConfiguration in
the respective application classes.

Then I should be able to have a global_config.py configuration file with
the common_port_number, and then use load_subconfig(global_config.py) in
each of the application specific config files.

Does that sound like the right idea?

Thank you again,
Glenn


On Tue, Feb 21, 2017 at 11:39 AM, Matthias Bussonnier <
bussonniermatthias at gmail.com> wrote:

> Hi Glenn,
>
> I think the idea is to make a Common dummy subclass:
>
> class MyConfigurable(configurable):
>     # class can be empty, or you can move the
>     # common_dir = Unicode('').tag(config=True)
>     # in it, up to you.
>     pass
>
>
> Then just inherit from it:
>
>   class Writer(MyConfigurable):
>       writer_trait = Int(4).tag(config=True)
>       common_dir = Unicode('').tag(config=True)
>
>   class Acquire(MyConfigurable):
>       acquire_trait = Int(55).tag(config=True)
>       common_dir = Unicode('').tag(config=True)
>
>   class Pipeline(MyConfigurable):
>       common_dir = Unicode('').tag(config=True)
>       def initialize(self):
>           self.writer = Writer()
>           self.acquire = Acquire()
>
>   class PipelineApp(Application):
>       classes = [Pipeline, Acquire, Writer]
>       def initialize(self,argv=None):
>           self.pipeline = Pipeline(config=self.config)
>           self.pipeline.initialize()
> >
> >
> > The idea is that the common_dir traits should be all the same. The code
> works as
> > written, but results in three possible lines in the settings file. Since
> the
> > settings file is just python, it's not too bad to do
> >
> > c.Pipeline.common_dir = '/output'
> > c.Acquire.common_dir = c.Pipeline.common_dir
> > c.Writer.common_dir = c.Pipeline.common_dir
>
>
> Now you just need to configure MyConfigurable for it to affect all classes.
>
>     c.MyConfigurable.common_dir = '/output'
>
> You can target one class in particular with what you do above.
>
> If you add parent=self
>
>     self.pipeline = Pipeline(config=self.config, parent=self)
>
> Then you can narrow down configuration by using parent/child selector;
>
>     c.PipelineApp.MyConfigurable.common_dir = '/output'
>
> It will target only MyConfigurable where `parent=self` is passed and
> parent is an
> instance of PipelineApp. (This is a rare case use in nbconvert to allow
> configuration of each exporter independently)
>
> Does that answer your questions ?
>
> --
>
> Matthias
>
> On Tue, Feb 21, 2017 at 7:01 AM, G Jones <glenn.caltech at gmail.com> wrote:
> > Hello,
> >
> > I am working on using traitlets.config in my project. The application has
> > this structure:
> >
> > class Writer(Configurable):
> >     writer_trait = Int(4).tag(config=True)
> >     common_dir = Unicode('').tag(config=True)
> >
> > class Acquire(Configurable):
> >     acquire_trait = Int(55).tag(config=True)
> >     common_dir = Unicode('').tag(config=True)
> >
> > class Pipeline(Configurable):
> >     common_dir = Unicode('').tag(config=True)
> >     def initialize(self):
> >         self.writer = Writer()
> >         self.acquire = Acquire()
> >
> > class PipelineApp(Application):
> >     classes = [Pipeline, Acquire, Writer]
> >     def initialize(self,argv=None):
> >         self.pipeline = Pipeline(config=self.config)
> >         self.pipeline.initialize()
> >
> >
> > The idea is that the common_dir traits should be all the same. The code
> > works as written, but results in three possible lines in the settings
> file.
> > Since the settings file is just python, it's not too bad to do
> > c.Pipeline.common_dir = '/output'
> > c.Acquire.common_dir = c.Pipeline.common_dir
> > c.Writer.common_dir = c.Pipeline.common_dir
> >
> > But it seems like there should be a better way.
> >
> > I see that I could pass in a parent and access it that way:
> > self.writer = Writer(parent=self)
> >
> > and then in writer:
> > self.parent.common_dir
> >
> > But then if I want to use Writer on its own, I need to do a check if
> > self.parent.... or something.
> >
> > Is there a better way? I hope the intent is clear, please let me know if
> > not.
> >
> > Thanks,
> > Glenn
> >
> > _______________________________________________
> > IPython-dev mailing list
> > IPython-dev at scipy.org
> > https://mail.scipy.org/mailman/listinfo/ipython-dev
> >
> _______________________________________________
> IPython-dev mailing list
> IPython-dev at scipy.org
> https://mail.scipy.org/mailman/listinfo/ipython-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ipython-dev/attachments/20170221/03b60b61/attachment.html>


More information about the IPython-dev mailing list