Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

dynamically modify help text

6 views
Skip to first unread message

Brian Blais

unread,
Jun 27, 2010, 7:27:10 PM6/27/10
to python-list@python.org list
Hello,

I know that the help text for an object will give a description of
every method based on the doc string. Is there a way to add
something to this text, specific to an object, but generated at run-
time? I have an object that reads a file, and I would like part of
that file to be shown if one does: help(myobject)


thanks,

Brian Blais

--
Brian Blais
bbl...@bryant.edu
http://web.bryant.edu/~bblais
http://bblais.blogspot.com/

Red Forks

unread,
Jun 27, 2010, 10:37:16 PM6/27/10
to Brian Blais, python-list@python.org list
Read you doc file and set the __doc__ attr of the object you want to change.

On Monday, June 28, 2010, Brian Blais <bbl...@bryant.edu> wrote:
> Hello,
>

> I know that the help text for an object will give a description of every method based on the doc string.  Is there a way to add something to this text, specific to an object, but generated at run-time?  I have an object that reads a file, and I would like part of that file to be shown if one does:  help(myobject)


>
>
>                        thanks,
>
>                                Brian Blais
>
> --
> Brian Blais
> bbl...@bryant.edu
> http://web.bryant.edu/~bblais
> http://bblais.blogspot.com/
>
>
>

> --
> http://mail.python.org/mailman/listinfo/python-list
>

Brian Blais

unread,
Jun 28, 2010, 2:13:44 PM6/28/10
to Red Forks, python-list@python.org list

On Jun 27, 2010, at 22:37 , Red Forks wrote:

> Read you doc file and set the __doc__ attr of the object you want
> to change.
>
> On Monday, June 28, 2010, Brian Blais <bbl...@bryant.edu> wrote:
>> I know that the help text for an object will give a description of
>> every method based on the doc string. Is there a way to add
>> something to this text, specific to an object, but generated at
>> run-time? I have an object that reads a file, and I would like
>> part of that file to be shown if one does: help(myobject)
>>
>>

python file:

#=============
class A(object):
pass

help_text="this is some text"

a=A()
a.__doc__=help_text
#=============


in ipython:

shows up here:

In [5]:a?
Type: A
Base Class: <class '__main__.A'>
String Form: <__main__.A object at 0x13270f0>
Namespace: Interactive
File: /Library/Frameworks/Python.framework/Versions/5.0.0/
lib/python2.5/site-packages/IPython/FakeModule.py
Docstring:
this is some text


but not with the help command:

In [6]:help(a)
Help on A in module __main__ object:

class A(__builtin__.object)
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)


also does the same thing with the regular python prompt.

is there a reason for this?

Chris Rebert

unread,
Jun 28, 2010, 2:25:39 PM6/28/10
to Brian Blais, python-list@python.org list

__doc__ is normally defined on classes, e.g. `A`, not instances, e.g.
`a`. help() looks for __doc__ accordingly.

Cheers,
Chris
--
http://blog.rebertia.com

Benjamin Kaplan

unread,
Jun 28, 2010, 3:02:50 PM6/28/10
to pytho...@python.org


Just to save the OP some trouble later on: this optimization is done
for most of the __*__ methods. Overriding __add__ on an instance won't
change the behavior of a + b.

Emile van Sebille

unread,
Jun 28, 2010, 4:13:26 PM6/28/10
to pytho...@python.org
On 6/28/2010 12:02 PM Benjamin Kaplan said...

> Just to save the OP some trouble later on: this optimization is done
> for most of the __*__ methods. Overriding __add__ on an instance won't
> change the behavior of a + b.

ActivePython 2.4.1 Build 247 (ActiveState Corp.) based on
Python 2.4.1 (#65, Jun 20 2005, 17:01:55) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class Test: pass
...
>>> i = Test()
>>> i+1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for +: 'instance' and 'int'
>>> def __add__(self): return 6
...
>>> i.__add__ = __add__
>>> i+1
6
>>>

Was this in reference to a specific python version?

Emile

Thomas Jollans

unread,
Jun 28, 2010, 4:46:08 PM6/28/10
to pytho...@python.org

ahem


Python 2.5.5 (r255:77872, Apr 21 2010, 08:40:04)
[GCC 4.4.3] on linux2


Type "help", "copyright", "credits" or "license" for more information.

>>> class A(object):
... def __add__(self, other):
... return "indeed"
...
>>> a = A()
>>> a + 1
'indeed'
>>> def new__add__(other):
... return "not at all"
...
>>> a.__add__ = new__add__
>>> a.__add__(1)
'not at all'
>>> a+1
'indeed'
>>>
>>>
>>> class B:
... def __add__(self, other):
... return 'now this is old-style'
...
>>> b = B()
>>> b+1
'now this is old-style'
>>> b.__add__ = new__add__
>>> b+1
'not at all'
>>>

I hate the fact that Python 2.x has two types of classes. Good riddance.

-- Thomas

Stephen Hansen

unread,
Jun 28, 2010, 4:48:52 PM6/28/10
to pytho...@python.org
On 6/28/10 1:13 PM, Emile van Sebille wrote:
> On 6/28/2010 12:02 PM Benjamin Kaplan said...
>> Just to save the OP some trouble later on: this optimization is done
>> for most of the __*__ methods. Overriding __add__ on an instance won't
>> change the behavior of a + b.
>
> ActivePython 2.4.1 Build 247 (ActiveState Corp.) based on
> Python 2.4.1 (#65, Jun 20 2005, 17:01:55) [MSC v.1310 32 bit (Intel)] on
> win32
> Type "help", "copyright", "credits" or "license" for more information.
> >>> class Test: pass
> ...
> >>> i = Test()
> >>> i+1
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> TypeError: unsupported operand type(s) for +: 'instance' and 'int'
> >>> def __add__(self): return 6
> ...
> >>> i.__add__ = __add__
> >>> i+1
> 6
> >>>
>
> Was this in reference to a specific python version?

No, its a reference to new-style vs old-style classes. If Test inherits
from object, it won't work. Its one of several subtle behaviorial
differences between old/new classes.

--

... Stephen Hansen
... Also: Ixokai
... Mail: me+list/python (AT) ixokai (DOT) io
... Blog: http://meh.ixokai.io/

Christian Heimes

unread,
Jun 28, 2010, 4:53:08 PM6/28/10
to pytho...@python.org
> >>> i.__add__ = __add__
> >>> i+1
> 6
> >>>
>
> Was this in reference to a specific python version?

This doesn't work with new style classes and thus not in Python 3.x.
Subclass from object and you'll see the difference.

Christian

Brian Blais

unread,
Jun 28, 2010, 8:23:46 PM6/28/10
to Chris Rebert, python-list@python.org list
On Jun 28, 2010, at 14:25 , Chris Rebert wrote:

>> On Jun 27, 2010, at 22:37 , Red Forks wrote:
>>> Read you doc file and set the __doc__ attr of the object you want to
>>> change.
>>>
>

> __doc__ is normally defined on classes, e.g. `A`, not instances, e.g.
> `a`. help() looks for __doc__ accordingly.
>
> Cheers,
> Chris

so that gets back to my original question: can I change this text at
runtime. Doesn't look like I can, because it is defined for classes
rather than instances. Am I thinking about this correctly?


bb

Ben Finney

unread,
Jun 28, 2010, 8:37:44 PM6/28/10
to
Brian Blais <bbl...@bryant.edu> writes:

> On Jun 28, 2010, at 14:25 , Chris Rebert wrote:
> > __doc__ is normally defined on classes, e.g. `A`, not instances,
> > e.g. `a`. help() looks for __doc__ accordingly.
>

> so that gets back to my original question: can I change this text at
> runtime. Doesn't look like I can, because it is defined for classes
> rather than instances. Am I thinking about this correctly?

Classes are objects. You can change the ‘__doc__’ attribute of a class
object the same as you'd change it for any other object::

A.__doc__ = "new docstring"

--
\ “All television is educational television. The question is: |
`\ what is it teaching?” —Nicholas Johnson |
_o__) |
Ben Finney

Steven D'Aprano

unread,
Jun 28, 2010, 10:19:34 PM6/28/10
to
On Tue, 29 Jun 2010 10:37:44 +1000, Ben Finney wrote:

> Brian Blais <bbl...@bryant.edu> writes:
>
>> On Jun 28, 2010, at 14:25 , Chris Rebert wrote:
>> > __doc__ is normally defined on classes, e.g. `A`, not instances, e.g.
>> > `a`. help() looks for __doc__ accordingly.
>>
>> so that gets back to my original question: can I change this text at
>> runtime. Doesn't look like I can, because it is defined for classes
>> rather than instances. Am I thinking about this correctly?
>
> Classes are objects. You can change the ‘__doc__’ attribute of a class
> object the same as you'd change it for any other object::
>
> A.__doc__ = "new docstring"


True, but what you can't do is:

a = A()
a.__doc__ = "new docstring"

unless you jump through hoops with __getattribute__ or descriptors.

--
Steven

Thomas Jollans

unread,
Jun 29, 2010, 7:51:57 AM6/29/10
to pytho...@python.org
On 06/29/2010 02:37 AM, Ben Finney wrote:
> Brian Blais <bbl...@bryant.edu> writes:
>
>> On Jun 28, 2010, at 14:25 , Chris Rebert wrote:
>>> __doc__ is normally defined on classes, e.g. `A`, not instances,
>>> e.g. `a`. help() looks for __doc__ accordingly.
>>
>> so that gets back to my original question: can I change this text at
>> runtime. Doesn't look like I can, because it is defined for classes
>> rather than instances. Am I thinking about this correctly?
>
> Classes are objects. You can change the ‘__doc__’ attribute of a class
> object the same as you'd change it for any other object::
>
> A.__doc__ = "new docstring"
>

No, you can't. Well, yeah, you can. But you can't. But you can. Ahrgh

I want Python 2.x to go away. It's so inconsistent and silly.

% python2.6
Python 2.6.5+ (release26-maint, Jun 28 2010, 19:46:36)
[GCC 4.4.4] on linux2


Type "help", "copyright", "credits" or "license" for more information.

>>> class OLD: pass
...
>>> class NEW(object): pass
...
>>> OLD.__doc__ = "foo"
>>> NEW.__doc__ = "bar"


Traceback (most recent call last):

File "<stdin>", line 1, in <module>
AttributeError: attribute '__doc__' of 'type' objects is not writable
>>>

Aahz

unread,
Jun 30, 2010, 12:38:40 PM6/30/10
to
In article <mailman.2338.1277812...@python.org>,

Thomas Jollans <tho...@jollans.com> wrote:
>
>% python2.6
>Python 2.6.5+ (release26-maint, Jun 28 2010, 19:46:36)
>[GCC 4.4.4] on linux2
>Type "help", "copyright", "credits" or "license" for more information.
>>>> class OLD: pass
>...
>>>> class NEW(object): pass
>...
>>>> OLD.__doc__ = "foo"
>>>> NEW.__doc__ = "bar"
>Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
>AttributeError: attribute '__doc__' of 'type' objects is not writable
>>>>

I'd argue that's a bug -- feel free to file one. I think this might
even be fixable in 2.7.1.
--
Aahz (aa...@pythoncraft.com) <*> http://www.pythoncraft.com/

"If you don't know what your program is supposed to do, you'd better not
start writing it." --Dijkstra

0 new messages