@@ -175,23 +175,38 @@ def default(self, value):
175175 return
176176 self ._default = self .type .deserialize (value )
177177
178+ def _get_envvar_value (self ):
179+ """
180+ Internal helper to get item value from an environment variable
181+ if item is controlled by one, and if the variable is set.
182+
183+ Returns not_set otherwise.
184+ """
185+ envvar_name = None
186+
187+ if self .envvar is True :
188+ envvar_name = self .envvar_name
189+ if envvar_name is None :
190+ envvar_name = '_' .join (self .get_path ()).upper ()
191+ elif self .envvar :
192+ envvar_name = self .envvar
193+
194+ if envvar_name and envvar_name in os .environ :
195+ return self .type .deserialize (os .environ [envvar_name ])
196+ else :
197+ return not_set
198+
178199 def get (self , fallback = not_set ):
179200 """
180201 Returns config value.
181202
182203 See Also:
183204 :meth:`.set` and :attr:`.value`
184205 """
185- if self .envvar :
186- if self .envvar is True :
187- envvar_name = self .envvar_name
188- if envvar_name is None :
189- envvar_name = '_' .join (self .get_path ()).upper ()
190- if envvar_name in os .environ :
191- return self .type .deserialize (os .environ [envvar_name ])
192- else :
193- if self .envvar in os .environ :
194- return self .type .deserialize (os .environ [self .envvar ])
206+
207+ envvar_value = self ._get_envvar_value ()
208+ if envvar_value is not not_set :
209+ return envvar_value
195210
196211 if self .has_value :
197212 if self ._value is not not_set :
@@ -268,15 +283,26 @@ def reset(self):
268283 def is_default (self ):
269284 """
270285 ``True`` if the item's value is its default value or if no value and no default value are set.
286+
287+ If the item is backed by an environment variable, this will be ``True`` only
288+ if the environment variable is set and is different to the
289+ default value of the item.
271290 """
272- return self ._value is not_set or self ._value == self .default
291+ envvar_value = self ._get_envvar_value ()
292+ if envvar_value is not not_set :
293+ return envvar_value == self .default
294+ else :
295+ return self ._value is not_set or self ._value == self .default
273296
274297 @property
275298 def has_value (self ):
276299 """
277300 ``True`` if item has a default value or custom value set.
278301 """
279- return self .default is not not_set or self ._value is not not_set
302+ if self ._get_envvar_value () is not not_set :
303+ return True
304+ else :
305+ return self .default is not not_set or self ._value is not not_set
280306
281307 @property
282308 def section (self ):
0 commit comments