diff -r 424fbf011176 -r 4a0ec19e4288 Lib/enum.py --- a/Lib/enum.py Tue Oct 14 08:59:14 2014 -0700 +++ b/Lib/enum.py Tue Oct 14 16:22:57 2014 +0000 @@ -464,12 +464,7 @@ return "%s.%s" % (self.__class__.__name__, self._name_) def __dir__(self): - added_behavior = [ - m - for cls in self.__class__.mro() - for m in cls.__dict__ - if m[0] != '_' - ] + added_behavior = [m for m in self.__class__.__dict__ if m[0] != '_'] return (['__class__', '__doc__', '__module__', 'name', 'value'] + added_behavior) diff -r 424fbf011176 -r 4a0ec19e4288 Lib/test/test_enum.py --- a/Lib/test/test_enum.py Tue Oct 14 08:59:14 2014 -0700 +++ b/Lib/test/test_enum.py Tue Oct 14 16:22:57 2014 +0000 @@ -176,18 +176,6 @@ set(['__class__', '__doc__', '__module__', 'name', 'value', 'wowser']), ) - def test_dir_on_sub_with_behavior_on_super(self): - # see issue22506 - class SuperEnum(Enum): - def invisible(self): - return "did you see me?" - class SubEnum(SuperEnum): - sample = 5 - self.assertEqual( - set(dir(SubEnum.sample)), - set(['__class__', '__doc__', '__module__', 'name', 'value', 'invisible']), - ) - def test_enum_in_enum_out(self): Season = self.Season self.assertIs(Season(Season.WINTER), Season.WINTER) diff -r 424fbf011176 -r 4a0ec19e4288 Lib/traceback.py --- a/Lib/traceback.py Tue Oct 14 08:59:14 2014 -0700 +++ b/Lib/traceback.py Tue Oct 14 16:22:57 2014 +0000 @@ -3,6 +3,8 @@ import linecache import sys import operator +import types +import collections __all__ = ['extract_stack', 'extract_tb', 'format_exception', 'format_exception_only', 'format_list', 'format_stack', @@ -51,7 +53,14 @@ # - Next item (same type as curr) # In practice, curr is either a traceback or a frame. def _extract_tb_or_stack_iter(curr, limit, extractor): - if limit is None: + # Check if limit is negative and curr is a traceback + condition = limit is not None and limit < 0 \ + and isinstance(curr, types.TracebackType) + # Collect last abs(limit) traceback entries. O(1) for pop operations + if condition: + seq = collections.deque(maxlen=abs(limit)) + + if limit is None or condition: limit = getattr(sys, 'tracebacklimit', None) n = 0 @@ -61,18 +70,25 @@ filename = co.co_filename name = co.co_name - linecache.checkcache(filename) - line = linecache.getline(filename, lineno, f.f_globals) + if not condition: + # Positive limit; load source immediately + linecache.checkcache(filename) + line = linecache.getline(filename, lineno, f.f_globals) + yield (filename, lineno, name, line.strip() if line else None) + else: + # Negative limit; load source after the loop. The last tuple + # element is a frame globals + seq.append((filename, lineno, name, f.f_globals)) - if line: - line = line.strip() - else: - line = None - - yield (filename, lineno, name, line) curr = next_item n += 1 + if condition: + for filename, lineno, name, f_globals in seq: + linecache.checkcache(filename) + line = linecache.getline(filename, lineno, f_globals) + yield (filename, lineno, name, line.strip() if line else None) + def _extract_tb_iter(tb, limit): return _extract_tb_or_stack_iter( tb, limit,