diff --git a/IPython/core/interactiveshell.py b/IPython/core/interactiveshell.py index a141900..3ecddda 100644 --- a/IPython/core/interactiveshell.py +++ b/IPython/core/interactiveshell.py @@ -34,7 +34,7 @@ from IPython.core import page from IPython.core import prefilter from IPython.core import shadowns from IPython.core import ultratb -from IPython.core.alias import AliasManager, AliasError +from IPython.core.alias import Alias, AliasManager from IPython.core.autocall import ExitAutocall from IPython.core.builtin_trap import BuiltinTrap from IPython.core.events import EventManager, available_events @@ -1502,6 +1502,7 @@ class InteractiveShell(SingletonConfigurable): found = True ospace = 'IPython internal' ismagic = True + isalias = isinstance(obj, Alias) # Last try: special-case some literals like '', [], {}, etc: if not found and oname_head in ["''",'""','[]','{}','()']: diff --git a/IPython/core/oinspect.py b/IPython/core/oinspect.py index 6e6b31b..6d65069 100644 --- a/IPython/core/oinspect.py +++ b/IPython/core/oinspect.py @@ -554,23 +554,6 @@ class Inspector: title = header((title+":").ljust(title_width)) out.append(cast_unicode(title) + cast_unicode(content)) return "\n".join(out) - - # The fields to be displayed by pinfo: (fancy_name, key_in_info_dict) - pinfo_fields1 = [("Type", "type_name"), - ] - - pinfo_fields2 = [("String form", "string_form"), - ] - - pinfo_fields3 = [("Length", "length"), - ("File", "file"), - ("Definition", "definition"), - ] - - pinfo_fields_obj = [("Class docstring", "class_docstring"), - ("Init docstring", "init_docstring"), - ("Call def", "call_def"), - ("Call docstring", "call_docstring")] def _format_info(self, obj, oname='', formatter=None, info=None, detail_level=0): """Format an info dict as text""" @@ -582,41 +565,62 @@ class Inspector: field = info[key] if field is not None: displayfields.append((title, field.rstrip())) - - add_fields(self.pinfo_fields1) - - # Base class for old-style instances - if (not py3compat.PY3) and isinstance(obj, types.InstanceType) and info['base_class']: - displayfields.append(("Base Class", info['base_class'].rstrip())) - - add_fields(self.pinfo_fields2) - - # Namespace - if info['namespace'] != 'Interactive': - displayfields.append(("Namespace", info['namespace'].rstrip())) - - add_fields(self.pinfo_fields3) - if info['isclass'] and info['init_definition']: - displayfields.append(("Init definition", - info['init_definition'].rstrip())) - - # Source or docstring, depending on detail level and whether - # source found. - if detail_level > 0 and info['source'] is not None: - displayfields.append(("Source", - self.format(cast_unicode(info['source'])))) - elif info['docstring'] is not None: - displayfields.append(("Docstring", info["docstring"])) - - # Constructor info for classes - if info['isclass']: - if info['init_docstring'] is not None: - displayfields.append(("Init docstring", - info['init_docstring'])) - - # Info for objects: + + if info['isalias']: + add_fields([('Repr', "string_form")]) + + elif info['ismagic']: + add_fields([("Docstring", "docstring"), + ("File", "file") + ]) + + elif info['isclass'] or is_simple_callable(obj): + # Functions, methods, classes + add_fields([("Signature", "definition"), + ("Init signature", "init_definition"), + ]) + if detail_level > 0 and info['source'] is not None: + add_fields([("Source", "source")]) + else: + add_fields([("Docstring", "docstring"), + ("Init docstring", "init_docstring"), + ]) + + add_fields([('File', 'file'), + ('Type', 'type_name'), + ]) + else: - add_fields(self.pinfo_fields_obj) + # General Python objects + add_fields([("Type", "type_name")]) + + # Base class for old-style instances + if (not py3compat.PY3) and isinstance(obj, types.InstanceType) and info['base_class']: + displayfields.append(("Base Class", info['base_class'].rstrip())) + + add_fields([("String form", "string_form")]) + + # Namespace + if info['namespace'] != 'Interactive': + displayfields.append(("Namespace", info['namespace'].rstrip())) + + add_fields([("Length", "length"), + ("File", "file"), + ("Definition", "definition"), + ]) + + # Source or docstring, depending on detail level and whether + # source found. + if detail_level > 0 and info['source'] is not None: + displayfields.append(("Source", + self.format(cast_unicode(info['source'])))) + elif info['docstring'] is not None: + displayfields.append(("Docstring", info["docstring"])) + + add_fields([("Class docstring", "class_docstring"), + ("Init docstring", "init_docstring"), + ("Call def", "call_def"), + ("Call docstring", "call_docstring")]) if displayfields: return self._format_fields(displayfields)