python - Allow help() to work on partial function object -


i'm trying make sure running help() @ python 2.7 repl displays __doc__ function wrapped functools.partial. running help() on functools.partial 'function' displays __doc__ of functools.partial class, not wrapped function's __doc__. there way achieve this?

consider following callables:

def foo(a):     """my function"""     pass  partial_foo = functools.partial(foo, 2) 

running help(foo) result in showing foo.__doc__. however, running help(partial_foo) results in __doc__ of partial object.

my first approach use functools.update_wrapper correctly replaces partial object's __doc__ foo.__doc__. however, doesn't fix 'problem' because of how pydoc.

i've investigated pydoc code, , issue seems partial_foo partial object not typical function/callable, see this question more information on detail.

by default, pydoc display __doc__ of object type, not instance if object passed determined class inspect.isclass. see render_doc function more information code itself.

so, in scenario above pydoc displaying of type, functools.partial not __doc__ of functools.partial instance.

is there anyway make alter call help() or functools.partial instance that's passed help() display __doc__ of instance, not type?

i found pretty hacky way this. wrote following function override __builtins__.help function:

def partialhelper(object=none):     if isinstance(object, functools.partial):         return pydoc.help(object.func)     else:         # preserve ability go interactive if user calls         # help() no arguments.         if object none:             return pydoc.help()         else:             return pydoc.help(object) 

then replace in repl with:

__builtins__.help = partialhelper 

this works , doesn't seem have major downsides, yet. however, there isn't way above naive implementation support still showing __doc__ of some functools.partial objects. it's or nothing, attach attribute wrapped (original) function indicate whether or not original __doc__ should shown. however, in scenario never want this.

note above not work when using ipython , embed functionality. because ipython directly sets shell's namespace references 'real' __builtin__, see code , old mailing list information on why is.

so, after investigation there's way hack ipython. must override site._helper class, used ipython explicitly setup system. following code when called before ipython.embed:

import site site._helper.__call__ = lambda self, *args, **kwargs: partialhelper(*args, **kwargs) 

are there other downsides i'm missing here?


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -