Fix multistring flags default handling (#890489)

With its 'append' action, optparse appends values to the supplied
default value. This leaves the user with no way of overriding the
default value. If you want to support overriding, you need to manually
handle setting the default value after parsing.

gflags supports overriding the default value so we must do the same.

Change-Id: I5810e16806e74876c7a310edbb6f8f27f0a3313b
This commit is contained in:
Mark McLoughlin
2011-11-15 07:01:43 +00:00
parent b95b73bbef
commit d089fb642a
2 changed files with 21 additions and 2 deletions

View File

@@ -71,8 +71,20 @@ class FlagValues(object):
self._parser = optparse.OptionParser()
self._parser.disable_interspersed_args()
self._extra_context = extra_context
self._multistring_defaults = {}
self.Reset()
def _apply_multistring_defaults(self, values):
#
# This horrendous hack is to stop optparse appending
# values to the default value. See:
# http://bugs.python.org/issue5088
#
for flag, default in self._multistring_defaults.items():
if not getattr(values, flag):
setattr(values, flag, default)
return values
def _parse(self):
if not self._values is None:
return
@@ -101,6 +113,8 @@ class FlagValues(object):
finally:
self._parser.error = error_catcher.orig_error
values = self._apply_multistring_defaults(values)
(self._values, self._extra) = (values, extra)
def __call__(self, argv):
@@ -190,7 +204,8 @@ class FlagValues(object):
action='callback', callback=parse_list)
def define_multistring(self, name, default, help):
self._add_option(name, default, help, action='append')
self._add_option(name, [], help, action='append')
self._multistring_defaults[name] = default
FLAGS = FlagValues()

View File

@@ -74,7 +74,11 @@ class FlagsTestCase(test.TestCase):
self.assertEqual(self.FLAGS.float, 6.66)
def test_define_multistring(self):
flags.DEFINE_multistring('multi', [], 'desc', flag_values=self.FLAGS)
flags.DEFINE_multistring('multi', ['blaa'], 'desc',
flag_values=self.FLAGS)
self.assert_(self.FLAGS['multi'])
self.assertEqual(self.FLAGS.multi, ['blaa'])
argv = ['flags_test', '--multi', 'foo', '--multi', 'bar']
self.FLAGS(argv)