From b0c1c31e420d243b5644c4158cea149b3b9771fb Mon Sep 17 00:00:00 2001 From: Brandon Low Date: Sat, 10 Jul 2010 11:21:53 -0700 Subject: [PATCH] options.py: differentiate unset and set-to-negative options. Unset options will still be None, but options explicitly set to a negative will now be 0. This doesn't change semantics for anything currently in bup, but it could be useful later when applying defaults. While we're here, clean up the option parsing code to make it very slightly more efficient. Signed-off-by: Brandon Low --- lib/bup/options.py | 23 ++++++++++------------- t/toptions.py | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/bup/options.py b/lib/bup/options.py index b40d6b4..c1a1455 100644 --- a/lib/bup/options.py +++ b/lib/bup/options.py @@ -6,7 +6,7 @@ class OptDict: def __setitem__(self, k, v): self._opts[k] = v - + def __getitem__(self, k): return self._opts[k] @@ -51,14 +51,14 @@ class Options: flagl = flags.split(',') flagl_nice = [] for f in flagl: - f_nice = re.sub(r'\W', '_', f) self._aliases[f] = flagl[0] - self._aliases[f_nice] = flagl[0] self._hasparms[f] = has_parm if len(f) == 1: self._shortopts += f + (has_parm and ':' or '') flagl_nice.append('-' + f) else: + f_nice = re.sub(r'\W', '_', f) + self._aliases[f_nice] = flagl[0] assert(not f.startswith('no-')) # supported implicitly self._longopts.append(f + (has_parm and '=' or '')) self._longopts.append('no-' + f) @@ -90,21 +90,18 @@ class Options: self.fatal(e) opt = OptDict() - for f in self._aliases.values(): - opt[f] = None for (k,v) in flags: - while k.startswith('-'): - k = k[1:] - if k in ['h', '?', 'help']: + k = k.lstrip('-') + if k in ('h', '?', 'help'): self.usage() if k.startswith('no-'): k = self._aliases[k[3:]] - opt[k] = None + v = 0 else: k = self._aliases[k] if not self._hasparms[k]: assert(v == '') - opt[k] = (opt._opts.get(k) or 0) + 1 + v = (opt._opts.get(k) or 0) + 1 else: try: vv = int(v) @@ -112,7 +109,7 @@ class Options: v = vv except ValueError: pass - opt[k] = v - for (f1,f2) in self._aliases.items(): - opt[f1] = opt[f2] + opt[k] = v + for (f1,f2) in self._aliases.iteritems(): + opt[f1] = opt._opts.get(f2) return (opt,flags,extra) diff --git a/t/toptions.py b/t/toptions.py index 4596e8b..da78995 100644 --- a/t/toptions.py +++ b/t/toptions.py @@ -46,4 +46,4 @@ def test_options(): WVPASSEQ((opt.t, opt.q, opt.p, opt.l, opt.onlylong, opt.neveropt), (3,1,7,19,1,None)) (opt,flags,extra) = o.parse(['--onlylong', '-t', '--no-onlylong']) - WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, None)) + WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, 0)) -- 2.39.2