diff options
Diffstat (limited to 'Lib/pydoc.py')
| -rw-r--r--[-rwxr-xr-x] | Lib/pydoc.py | 36 | 
1 files changed, 24 insertions, 12 deletions
| diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 0d0d0abec1..39db3915dc 100755..100644 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -209,6 +209,18 @@ def classify_class_attrs(object):          results.append((name, kind, cls, value))      return results +def sort_attributes(attrs, object): +    'Sort the attrs list in-place by _fields and then alphabetically by name' +    # This allows data descriptors to be ordered according +    # to a _fields attribute if present. +    fields = getattr(object, '_fields', []) +    try: +        field_order = {name : i-len(fields) for (i, name) in enumerate(fields)} +    except TypeError: +        field_order = {} +    keyfunc = lambda attr: (field_order.get(attr[0], 0), attr[0]) +    attrs.sort(key=keyfunc) +  # ----------------------------------------------------- module manipulation  def ispackage(path): @@ -338,7 +350,7 @@ def safeimport(path, forceload=0, cache={}):          elif exc is SyntaxError:              # A SyntaxError occurred before we could execute the module.              raise ErrorDuringImport(value.filename, info) -        elif exc is ImportError and value.name == path: +        elif issubclass(exc, ImportError) and value.name == path:              # No such module in the path.              return None          else: @@ -868,8 +880,7 @@ class HTMLDoc(Doc):                                                             object.__module__)              tag += ':<br>\n' -            # Sort attrs by name. -            attrs.sort(key=lambda t: t[0]) +            sort_attributes(attrs, object)              # Pump out the attrs, segregated by kind.              attrs = spill('Methods %s' % tag, attrs, @@ -1287,8 +1298,8 @@ location listed above.              else:                  tag = "inherited from %s" % classname(thisclass,                                                        object.__module__) -            # Sort attrs by name. -            attrs.sort() + +            sort_attributes(attrs, object)              # Pump out the attrs, segregated by kind.              attrs = spill("Methods %s:\n" % tag, attrs, @@ -1418,13 +1429,14 @@ def getpager():          return plainpager      if not sys.stdin.isatty() or not sys.stdout.isatty():          return plainpager -    if 'PAGER' in os.environ: +    use_pager = os.environ.get('MANPAGER') or os.environ.get('PAGER') +    if use_pager:          if sys.platform == 'win32': # pipes completely broken in Windows -            return lambda text: tempfilepager(plain(text), os.environ['PAGER']) +            return lambda text: tempfilepager(plain(text), use_pager)          elif os.environ.get('TERM') in ('dumb', 'emacs'): -            return lambda text: pipepager(plain(text), os.environ['PAGER']) +            return lambda text: pipepager(plain(text), use_pager)          else: -            return lambda text: pipepager(text, os.environ['PAGER']) +            return lambda text: pipepager(text, use_pager)      if os.environ.get('TERM') in ('dumb', 'emacs'):          return plainpager      if sys.platform == 'win32': @@ -1901,10 +1913,10 @@ has the same effect as typing a particular string at the help> prompt.      def intro(self):          self.output.write(''' -Welcome to Python %s's help utility! +Welcome to Python {0}'s help utility!  If this is your first time using Python, you should definitely check out -the tutorial on the Internet at http://docs.python.org/%s/tutorial/. +the tutorial on the Internet at http://docs.python.org/{0}/tutorial/.  Enter the name of any module, keyword, or topic to get help on writing  Python programs and using Python modules.  To quit this help utility and @@ -1914,7 +1926,7 @@ To get a list of available modules, keywords, symbols, or topics, type  "modules", "keywords", "symbols", or "topics".  Each module also comes  with a one-line summary of what it does; to list the modules whose name  or summary contain a given string such as "spam", type "modules spam". -''' % tuple([sys.version[:3]]*2)) +'''.format('%d.%d' % sys.version_info[:2]))      def list(self, items, columns=4, width=80):          items = list(sorted(items)) | 
