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

Dynamic generation of doc-strings of dynamically generated classes

3 views
Skip to first unread message

Mikael Olofsson

unread,
Oct 17, 2005, 8:10:36 AM10/17/05
to
Hi!

I've asked Google, but have not found any useful information there.

Situation: I have a base class, say

>>> class base(object):
ImportantClassAttribute = None

Now, I want to dynamically generate subclasses of base. That's not a
problem. However, I very much want those subclasses to have individual
doc-strings. More precicely, I want that important class attribute to be
reflected in the doc-string. That's the problem. The only way I've
managed to accomplish that is something like the following.

>>> ImportantClassAttribute = 7
>>> docString = 'The case %s.' % (ImportantClassAttribute,)
>>> exec('''class new(base):
"""%s"""
pass ''' % (docString,))
>>> new.ImportantClassAttribute = ImportantClassAttribute
>>> new.__doc__
'The case 7.'

This works as intended. The subclasses do get the doc-strings I want
them to have, and I can live with this solution. But: This solution does
not strike me as especially beautiful or readable. My first naïve
attempt was instead the following.

>>> class new(base):
pass

>>> new.ImportantClassAttribute = 7
>>> new.__doc__ = ('The case %(ImportantClassAttribute)s.'
% new.__dict__)

Traceback (most recent call last):
File "<pyshell#35>", line 1, in -toplevel-
new.__doc__ = ('The case %(ImportantClassAttribute)s.'
TypeError: attribute '__doc__' of 'type' objects is not writable

This is readable to me, but apparently not the way to go, since I'm not
allowed to replace the doc-string like this. I've also tried a number of
other ways, but they all stumble on similar reasons.

Any ideas? Am I stuck with the clumsy exec-solution, or are there other
ways to dynamically generate doc-strings of classes?

/MiO

Alex Martelli

unread,
Oct 17, 2005, 9:55:47 AM10/17/05
to
Mikael Olofsson <mik...@isy.liu.se> wrote:
...

> Any ideas? Am I stuck with the clumsy exec-solution, or are there other
> ways to dynamically generate doc-strings of classes?

The best way to make classes on the fly is generally to call the
metaclass with suitable parameters (just like, the best way to make
instances of any type is generally to call that type):

derived = type(base)('derived', (base,), {'__doc__': 'zipp'})


Alex

George Sakkis

unread,
Oct 17, 2005, 10:01:58 AM10/17/05
to
"Mikael Olofsson" <mik...@isy.liu.se> wrote:

> Hi!
>
> I've asked Google, but have not found any useful information there.
>
> Situation: I have a base class, say
>
> >>> class base(object):
> ImportantClassAttribute = None
>
> Now, I want to dynamically generate subclasses of base. That's not a
> problem. However, I very much want those subclasses to have individual
> doc-strings. More precicely, I want that important class attribute to be
> reflected in the doc-string. That's the problem. The only way I've
> managed to accomplish that is something like the following.
>
> >>> ImportantClassAttribute = 7
> >>> docString = 'The case %s.' % (ImportantClassAttribute,)
> >>> exec('''class new(base):
> """%s"""
> pass ''' % (docString,))
> >>> new.ImportantClassAttribute = ImportantClassAttribute
> >>> new.__doc__
> 'The case 7.'
>
> This works as intended. The subclasses do get the doc-strings I want
> them to have, and I can live with this solution. But: This solution does

> not strike me as especially beautiful or readable. My first naīve


> attempt was instead the following.
>
> >>> class new(base):
> pass
>
> >>> new.ImportantClassAttribute = 7
> >>> new.__doc__ = ('The case %(ImportantClassAttribute)s.'
> % new.__dict__)
>
> Traceback (most recent call last):
> File "<pyshell#35>", line 1, in -toplevel-
> new.__doc__ = ('The case %(ImportantClassAttribute)s.'
> TypeError: attribute '__doc__' of 'type' objects is not writable
>
> This is readable to me, but apparently not the way to go, since I'm not
> allowed to replace the doc-string like this. I've also tried a number of
> other ways, but they all stumble on similar reasons.
>
> Any ideas? Am I stuck with the clumsy exec-solution, or are there other
> ways to dynamically generate doc-strings of classes?

There's nothing specifically about doc-strings, but you can create and customise a whole class
dynamically:

def makeBaseSubclass(impClassAttr):
return type('new_%s' % impClassAttr,
(base,object),
{'ImportantClassAttribute': impClassAttr,
'__doc__': 'The case %s' % impClassAttr})

>>> new = makeBaseSubclass(7)
>>> new.ImportantClassAttribute
7
>>> new.__doc__
'The case 7'


HTH,
George


Mikael Olofsson

unread,
Oct 18, 2005, 3:23:41 AM10/18/05
to
Alex Martelli wrote:
> The best way to make classes on the fly is generally to call the
> metaclass with suitable parameters (just like, the best way to make
> instances of any type is generally to call that type):
>
> derived = type(base)('derived', (base,), {'__doc__': 'zipp'})

and George Sakkis said something similar.

Thanks, both of you. As I expected, there was a much better way than my
clumsy way. Anyway, this took me to section 3.3.3 in the reference
manual, and that will help me further.

Thanks again. Back to the keyboard!

/MiO

0 new messages