On 07/08/14 17:39, Kevin L. Mitchell wrote: > On Thu, 2014-08-07 at 17:27 +0100, Matthew Booth wrote: >> On 07/08/14 16:27, Kevin L. Mitchell wrote: >>> On Thu, 2014-08-07 at 12:15 +0100, Matthew Booth wrote: >>>> A (the?) solution is to register_opts() in foo before importing any >>>> modules which might also use oslo.config. >>> >>> Actually, I disagree. The real problem here is the definition of >>> bar_func(). The default value of the parameter "arg" will likely always >>> be the default value of foo_opt, rather than the configured value, >>> because "CONF.foo_opt" will be evaluated at module load time. The way >>> bar_func() should be defined would be: >>> >>> def bar_func(arg=None): >>> if not arg: >>> arg = CONF.foo_opt >>> … >>> >>> That ensures that arg will be the configured value, and should also >>> solve the import conflict. >> >> That's different behaviour, because you can no longer pass arg=None. The >> fix isn't to change the behaviour of the code. > > Well, the point is that the code as written is incorrect. And if 'None' > is an input you want to allow, then use an incantation like: > > _unset = object() > > def bar_func(arg=_unset): > if arg is _unset: > arg = CONF.foo_opt > … > > In any case, the operative point is that CONF.<attribute> must always be > evaluated inside run-time code, never at module load time.
...unless you call register_opts() safely, which is what I'm proposing. Matt -- Matthew Booth Red Hat Engineering, Virtualisation Team Phone: +442070094448 (UK) GPG ID: D33C3490 GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490 _______________________________________________ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev