<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 7, 2014 at 12:54 PM, Kevin L. Mitchell <span dir="ltr"><<a href="mailto:kevin.mitchell@rackspace.com" target="_blank">kevin.mitchell@rackspace.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="">On Thu, 2014-08-07 at 17:46 +0100, Matthew Booth wrote:<br>
> > In any case, the operative point is that CONF.<attribute> must<br>
> always be<br>
> > evaluated inside run-time code, never at module load time.<br>
><br>
> ...unless you call register_opts() safely, which is what I'm<br>
> proposing.<br>
<br>
</div>No, calling register_opts() at a different point only fixes the import<br>
issue you originally complained about; it does not fix the problem that<br>
the configuration option is evaluated at the wrong time.  The example<br>
code you included in your original email evaluates the configuration<br>
option at module load time, BEFORE the configuration has been loaded,<br>
which means that the argument default will be the default of the<br>
configuration option, rather than the configured value of the<br>
configuration option.  Configuration options must be evaluated at<br>
RUN-TIME, after configuration is loaded; they must not be evaluated at<br>
LOAD-TIME, which is what your original code does.<br>
<div class="im">--<br>
Kevin L. Mitchell <<a href="mailto:kevin.mitchell@rackspace.com">kevin.mitchell@rackspace.com</a>><br>
Rackspace<br></div></blockquote><div><br></div><div>We had this problem in Keystone[1]. There were some config parameters passed to a function decorator (it was the cache timeout time). You'd change the value in the config file and it would have no effect... the default was still used. Luckily the cache decorator also took a function so it was an easy fix, just pass `lambda: CONF.foo`. The mistaken code was made possible because the config options were registered at import time. Keystone now registers its config options at run-time so using CONF.foo at import-time fails with an error that the option isn't registered.<br>
<br>[1] <a href="https://bugs.launchpad.net/keystone/+bug/1265670">https://bugs.launchpad.net/keystone/+bug/1265670</a><br><br></div><div>- Brant<br><br></div></div></div></div>