Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a73dc9d

Browse files
committed
configparser: read-only attributes to get the section name and parser from a SectionProxy instance
1 parent 5c86339 commit a73dc9d

2 files changed

Lines changed: 34 additions & 17 deletions

File tree

Lib/configparser.py

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,42 +1102,52 @@ def set(self, section, option, value=None):
11021102
class SectionProxy(MutableMapping):
11031103
"""A proxy for a single section from a parser."""
11041104

1105-
def __init__(self, parser, section_name):
1106-
"""Creates a view on a section named `section_name` in `parser`."""
1105+
def __init__(self, parser, name):
1106+
"""Creates a view on a section of the specified `name` in `parser`."""
11071107
self._parser = parser
1108-
self._section = section_name
1108+
self._name = name
11091109
self.getint = functools.partial(self._parser.getint,
1110-
self._section)
1110+
self._name)
11111111
self.getfloat = functools.partial(self._parser.getfloat,
1112-
self._section)
1112+
self._name)
11131113
self.getboolean = functools.partial(self._parser.getboolean,
1114-
self._section)
1114+
self._name)
11151115

11161116
def __repr__(self):
1117-
return '<Section: {}>'.format(self._section)
1117+
return '<Section: {}>'.format(self._name)
11181118

11191119
def __getitem__(self, key):
1120-
if not self._parser.has_option(self._section, key):
1120+
if not self._parser.has_option(self._name, key):
11211121
raise KeyError(key)
1122-
return self._parser.get(self._section, key)
1122+
return self._parser.get(self._name, key)
11231123

11241124
def __setitem__(self, key, value):
11251125
self._parser._validate_value_type(value)
1126-
return self._parser.set(self._section, key, value)
1126+
return self._parser.set(self._name, key, value)
11271127

11281128
def __delitem__(self, key):
1129-
if not self._parser.has_option(self._section, key):
1129+
if not self._parser.has_option(self._name, key):
11301130
raise KeyError(key)
1131-
return self._parser.remove_option(self._section, key)
1131+
return self._parser.remove_option(self._name, key)
11321132

11331133
def __contains__(self, key):
1134-
return self._parser.has_option(self._section, key)
1134+
return self._parser.has_option(self._name, key)
11351135

11361136
def __len__(self):
11371137
# XXX weak performance
1138-
return len(self._parser.options(self._section))
1138+
return len(self._parser.options(self._name))
11391139

11401140
def __iter__(self):
11411141
# XXX weak performance
11421142
# XXX does not break when underlying container state changed
1143-
return self._parser.options(self._section).__iter__()
1143+
return self._parser.options(self._name).__iter__()
1144+
1145+
@property
1146+
def parser(self):
1147+
# The parser object of the proxy is read-only.
1148+
return self._parser
1149+
1150+
@property
1151+
def name(self):
1152+
# The name of the section on a proxy is read-only.
1153+
return self._name

Lib/test/test_cfgparser.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,15 @@ def basic_test(self, cf):
135135
# mapping access
136136
eq(cf['Foo Bar']['foo'], 'bar1')
137137
eq(cf['Spacey Bar']['foo'], 'bar2')
138-
eq(cf['Spacey Bar From The Beginning']['foo'], 'bar3')
139-
eq(cf['Spacey Bar From The Beginning']['baz'], 'qwe')
138+
section = cf['Spacey Bar From The Beginning']
139+
eq(section.name, 'Spacey Bar From The Beginning')
140+
self.assertIs(section.parser, cf)
141+
with self.assertRaises(AttributeError):
142+
section.name = 'Name is read-only'
143+
with self.assertRaises(AttributeError):
144+
section.parser = 'Parser is read-only'
145+
eq(section['foo'], 'bar3')
146+
eq(section['baz'], 'qwe')
140147
eq(cf['Commented Bar']['foo'], 'bar4')
141148
eq(cf['Commented Bar']['baz'], 'qwe')
142149
eq(cf['Spaces']['key with spaces'], 'value')

0 commit comments

Comments
 (0)