Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
gh-66449: Add support to unnamed sections in ConfigParser#2735
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
the-knights-who-say-ni commentedJul 16, 2017
Hello, and thanks for your contribution! I'm a bot set up to make sure that the project can legally accept your contribution by verifying you have signed thePSF contributor agreement (CLA). Unfortunately we couldn't find an account corresponding to your GitHub username onbugs.python.org (b.p.o) to verify you have signed the CLA (this might be simply due to a missing "GitHub Name" entry in your b.p.o account settings). This is necessary for legal reasons before we can look at your contribution. Please followthe steps outlined in the CPython devguide to rectify this issue. Thanks again to your contribution and we look forward to looking at it! |
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
ottok commentedApr 25, 2021
This PR closeshttps://bugs.python.org/issue22253 from 2014 While waiting for this change to land in Python, a huge amount of people seem to use these workarounds: |
This PR is stale because it has been open for 30 days with no activity. |
ottok commentedFeb 20, 2022
This PR should be merged and not closed for being "stale". |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Both test cases were successful:test_no_first_section (Lib.test.test_configparser.SectionlessTestCase) ... ok test_no_section (Lib.test.test_configparser.SectionlessTestCase) ... ok
SO examples work, but if you print the key you get DEFAULT and if you want to see theget()
you need to use a blank key ''.
This PR is stale because it has been open for 30 days with no activity. |
ChristianSi commentedJul 1, 2022
Why is this not merged yet? It would be great to have! |
arhadthedev commentedJul 1, 2022 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@ChristianSi Probably because#2735 (review) is not addressed. |
This PR is stuck for five years, so cc@ambv as a configparser expert. |
ChristianSi commentedAug 2, 2022
Any news on this one? |
This PR is stale because it has been open for 30 days with no activity. |
ChristianSi commentedSep 20, 2022
@pslacerda It seems this PR got stalled because you didn't address theproposal to use a sentinel object instead of the empty string (as per your own suggestion). Could you implement that change to get this moving again? Also, the branch would have be to rebased or main merged into it to get it up-to-date. Would be great if we could finally get this completed! |
ChristianSi commentedApr 10, 2023
@arhadthedev Good to read from you. Could you maybe help us to get this finally merged into main? |
This PR is stale because it has been open for 30 days with no activity. |
This comment was marked as abuse.
This comment was marked as abuse.
Even with big desire, nobody can merge any new feature until 3.12b1 is out. The release date is already urgently moved from the last Monday to May 22. Fromhttps://discuss.python.org/t/postponing-3-12-beta-1-feature-freeze/26406:
|
Uh oh!
There was an error while loading.Please reload this page.
This PR is stale because it has been open for 30 days with no activity. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
As well clarifying whether headerless options should leak into other sections, maybe there should be tests and documentation for the behaviour of:
- config.add_section(TOP_LEVEL)
- config[TOP_LEVEL] = ...
- Creating and retrieving TOP_LEVEL section when reading headerless section not enabled
- Using TOP_LEVEL as a regular name, e.g. sorted(config.keys())
@@ -68,6 +69,12 @@ | |||
converter gets its corresponding get*() method on the parser object and | |||
section proxies. | |||
When `allow_unnamed_section` is True (default: False), options | |||
without section are accepted: the section for this is |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
options withouta section?
return "<TOP_LEVEL>" | ||
def __eq__(self, other): | ||
return repr(self) == repr(other) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Why did__eq__
get implemented? It makes more sense to me to keep the default inherited implementation. Doesn’t the class only get instantiated once anyway?
Won’t this make a valid section headed [<TOP_LEVEL>] match the headerless section in some cases?
@@ -0,0 +1,4 @@ | |||
:class:`configparser.ConfigParser` now accepts unnamed sections before named | |||
ones, if configured to do so. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
“acceptsan unnamedsection before named ones” might be clearer
@@ -68,6 +69,12 @@ | |||
converter gets its corresponding get*() method on the parser object and | |||
section proxies. | |||
When `allow_unnamed_section` is True (default: False), options | |||
without section are accepted: the section for this is | |||
``configparser.UNNAMED_SECTION``. In the file, they are placed before |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
configparser.TOP_LEVEL?
@@ -18,7 +18,8 @@ | |||
delimiters=('=', ':'), comment_prefixes=('#', ';'), | |||
inline_comment_prefixes=None, strict=True, | |||
empty_lines_in_values=True, default_section='DEFAULT', | |||
interpolation=<unset>, converters=<unset>): | |||
interpolation=<unset>, converters=<unset>, | |||
allow_unnamed_section=False): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
allow_unnamed_section not implemented
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
This seems ok.
Uh oh!
There was an error while loading.Please reload this page.
hw-claudio commentedMar 26, 2024
this feature would be very important to integrate. Is it available yet? The Windows INI files and the GetProfileString family of APIs have had this undocumented behavior forever, where an empty section is absolutely present and used by software. See the following wine commits and bugs related to it: wine-mirror/wine@be678a5 I would like to use ConfigParser, but currently cannot due to this missing feature, so I am open coding the config file parsing, which I would gladly avoid. |
ChristianSi commentedMar 26, 2024
@vadmium Thanks for your review! @pslacerda Are you still around and willing to make the changes suggested in the review? They seem quite reasonable to me. |
ChristianSi commentedMar 26, 2024 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@hw-claudio I alsolutely agree, it would be great to have!
|
I don't even remember the original motivation why I did this PR. I failed to merge into this PR, so I did a new one. |
Finally seems that we will get this code into main. Thank you@ChristianSi! |
ChristianSi commentedMar 29, 2024
@pslacerda Wow, that's wonderful news, thanks a lot for all your effort! |
Co-authored-by: Furkan Onder <furkanonder@protonmail.com>
Thank you@ChristianSi and@jaraco, it finally got merged. |
Uh oh!
There was an error while loading.Please reload this page.
Add support to files that have key-value pairs before any section or no section at all. Unnamed sections are enabled when passing
allow_unnamed_section=True
toconfigparser.ConfigParser
and are stored as an empty string.