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

Reply via email to