Dynamic generation of doc-strings of dynamically generated classes

Discussion in 'Python' started by Mikael Olofsson, Oct 17, 2005.

  1. 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
    Mikael Olofsson, Oct 17, 2005
    #1
    1. Advertising

  2. Mikael Olofsson <> 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
    Alex Martelli, Oct 17, 2005
    #2
    1. Advertising

  3. "Mikael Olofsson" <> 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
    George Sakkis, Oct 17, 2005
    #3
  4. 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
    Mikael Olofsson, Oct 18, 2005
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Matt
    Replies:
    3
    Views:
    485
    Tor Iver Wilhelmsen
    Sep 17, 2004
  2. kevincw01
    Replies:
    1
    Views:
    776
    kevincw01
    Mar 30, 2006
  3. George Sakkis

    Pickling dynamically generated classes

    George Sakkis, Jan 26, 2008, in forum: Python
    Replies:
    0
    Views:
    281
    George Sakkis
    Jan 26, 2008
  4. Paul Brannan
    Replies:
    4
    Views:
    109
    Paul Brannan
    Jul 19, 2004
  5. Derek Wong
    Replies:
    1
    Views:
    73
Loading...

Share This Page