abukaj
abukaj

Reputation: 2712

When (and why) has been `__name__` magic variable removed from `ConfigParser` interpolation?

In Python 2.7 ConfigParser.ConfigParser interpolates pattern %(__name__)s as name of the section.

In Python 3.6 (as well as 3.3) configparser.ConfigParser fails at the same interpolation with InterpolationMissingOptionError exception.

When has the behaviour of the interpolation changed? What is the rationale of the decision (as it is harming backward-compatibility)?

In contrast to how to interpolate the section-name with configparser I am not asking how can I get that interpolation in Python 3.x.

Upvotes: 0

Views: 206

Answers (1)

snakecharmerb
snakecharmerb

Reputation: 55884

In python 3.2 the old ConfigParser class (which implemented __name__ interpolation) was removed and replaced by what had previously been the SafeConfigParser class. From the What's New file:

The configparser module was modified to improve usability and predictability of the default parser and its supported INI syntax. The old ConfigParser class was removed in favor of SafeConfigParser which has in turn been renamed to ConfigParser.

The detailed motivation seems to be described in this bug report:

I want to sum up all strange things about the behaviour of __name__, a special key present in every section of a parser instance.

  1. There is a special __name__ key in every section.
  2. Except for the DEFAULTSECT.
  3. __name__ key is set for every section read from a file.
  4. and not when adding by add_section().
  5. if __name__ does exist, it's not visible in parser.options('section')
  6. but it is visible here: parser.has_option('section', '__name__') == True
  7. and can be obtained by parser.get('section', '__name__')
  8. and can be changed by parser.set('section', '__name__', 'ANY VALUE')
  9. and can be removed by parser.remove_option('section', '__name__')
  10. even if the value is changed by parser.set(), it won't be written back to a file with parser.write()

All this looks like a feature that was not particularly complete and well defined when it was first created. Or possibly, it became rotten with time and now nobody is using it anyway. That way or the other, I couldn't come up with a valid use case for __name__ with the current implementation. It doesn't serve any internal purpose and the only way you can actually get it is to parser.get('section', '__name__') which returns 'section' anyway. About as useless as it gets. Of course, one can go and take the internal parser._sections data structure of the parser but that's evil.

I want simply remove all mentions of a special __name__ key in configparser.py. Backwards compatibility is not a concern here because in this case we have a concept that is so broken that you can't actually use it.

Upvotes: 1

Related Questions