diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2010-07-08 21:15:36 +0000 |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2010-07-08 21:15:36 +0000 |
commit | 0dd8f7890a3396eaef8c740588c65af9422a65a5 (patch) | |
tree | c74351d4e8024c7f455eb6c202eb1b483353ad3a /Lib/decimal.py | |
parent | e42f1bb3548f322bc0fd4a5db4cff26be901a034 (diff) | |
download | cpython-git-0dd8f7890a3396eaef8c740588c65af9422a65a5.tar.gz |
Issue #9136: Profiling Decimal gave 'dictionary changed size during iteration'.
Remove the use of locals() that caused this error.
Diffstat (limited to 'Lib/decimal.py')
-rw-r--r-- | Lib/decimal.py | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/Lib/decimal.py b/Lib/decimal.py index 5cb5ea9ba0..c3dffa3ed7 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -3813,20 +3813,38 @@ class Context(object): Emin=None, Emax=None, capitals=None, clamp=None, _ignored_flags=None): - if flags is None: - flags = [] + # Set defaults; for everything except flags and _ignored_flags, + # inherit from DefaultContext. + try: + dc = DefaultContext + except NameError: + pass + + self.prec = prec if prec is not None else dc.prec + self.rounding = rounding if rounding is not None else dc.rounding + self.Emin = Emin if Emin is not None else dc.Emin + self.Emax = Emax if Emax is not None else dc.Emax + self.capitals = capitals if capitals is not None else dc.capitals + self.clamp = clamp if clamp is not None else dc.clamp + if _ignored_flags is None: - _ignored_flags = [] - if not isinstance(flags, dict): - flags = dict([(s, int(s in flags)) for s in _signals]) - if traps is not None and not isinstance(traps, dict): - traps = dict([(s, int(s in traps)) for s in _signals]) - for name, val in locals().items(): - if val is None: - setattr(self, name, _copy.copy(getattr(DefaultContext, name))) - else: - setattr(self, name, val) - del self.self + self._ignored_flags = [] + else: + self._ignored_flags = _ignored_flags + + if traps is None: + self.traps = dc.traps.copy() + elif not isinstance(traps, dict): + self.traps = dict((s, int(s in traps)) for s in _signals) + else: + self.traps = traps + + if flags is None: + self.flags = dict.fromkeys(_signals, 0) + elif not isinstance(flags, dict): + self.flags = dict((s, int(s in flags)) for s in _signals) + else: + self.flags = flags def __repr__(self): """Show the current context.""" |