[Python-Dev] Re: [PEP 224] Attribute Docstrings
M.-A. Lemburg
mal at lemburg.com
Mon Aug 28 04:55:15 EDT 2000
Christian Tanzer wrote:
>
> "M.-A. Lemburg" <mal at lemburg.com> wrote:
>
> > This PEP proposes a small addition to the way Python currently
> > handles docstrings embedded in Python code.
> (snip)
> > Here is an example:
> >
> > class C:
> > "class C doc-string"
> >
> > a = 1
> > "attribute C.a doc-string (1)"
> >
> > b = 2
> > "attribute C.b doc-string (2)"
> >
> > The docstrings (1) and (2) are currently being ignored by the
> > Python byte code compiler, but could obviously be put to good use
> > for documenting the named assignments that precede them.
> >
> > This PEP proposes to also make use of these cases by proposing
> > semantics for adding their content to the objects in which they
> > appear under new generated attribute names.
>
> Great proposal. This would make docstrings even more useful.
Right :-)
> > In order to preserve features like inheritance and hiding of
> > Python's special attributes (ones with leading and trailing double
> > underscores), a special name mangling has to be applied which
> > uniquely identifies the docstring as belonging to the name
> > assignment and allows finding the docstring later on by inspecting
> > the namespace.
> >
> > The following name mangling scheme achieves all of the above:
> >
> > __doc__<attributename>__
>
> IMHO, David Goodger's (<dgoodger at bigfoot.com>) idea of using a
> __docs__ dictionary is a better solution:
>
> - It provides all docstrings for the attributes of an object in a
> single place.
>
> * Handy in interactive mode.
> * This simplifies the generation of documentation considerably.
>
> - It is easier to explain in the documentation
The downside is that it doesn't work well together with
class inheritance: docstrings of the above form can
be overridden or inherited just like any other class
attribute.
> > To keep track of the last assigned name, the byte code compiler
> > stores this name in a variable of the compiling structure. This
> > variable defaults to NULL. When it sees a docstring, it then
> > checks the variable and uses the name as basis for the above name
> > mangling to produce an implicit assignment of the docstring to the
> > mangled name. It then resets the variable to NULL to avoid
> > duplicate assignments.
>
> Normally, Python concatenates adjacent strings. It doesn't do this
> with docstrings. I think Python's behavior would be more consistent
> if docstrings were concatenated like any other strings.
Huh ? It does...
>>> class C:
... "first line"\
... "second line"
...
>>> C.__doc__
'first linesecond line'
And the same works for the attribute doc strings too.
> > Since the implementation does not reset the compiling structure
> > variable when processing a non-expression, e.g. a function
> > definition, the last assigned name remains active until either the
> > next assignment or the next occurrence of a docstring.
> >
> > This can lead to cases where the docstring and assignment may be
> > separated by other expressions:
> >
> > class C:
> > "C doc string"
> >
> > b = 2
> >
> > def x(self):
> > "C.x doc string"
> > y = 3
> > return 1
> >
> > "b's doc string"
> >
> > Since the definition of method "x" currently does not reset the
> > used assignment name variable, it is still valid when the compiler
> > reaches the docstring "b's doc string" and thus assigns the string
> > to __doc__b__.
>
> This is rather surprising behavior. Does this mean that a string in
> the middle of a function definition would be interpreted as the
> docstring of the function?
No, since at the beginning of the function the name variable
is set to NULL.
> For instance,
>
> def spam():
> a = 3
> "Is this spam's docstring? (not in 1.5.2)"
> return 1
>
> Anyway, the behavior of Python should be the same for all kinds of
> docstrings.
>
> > A possible solution to this problem would be resetting the name
> > variable for all non-expression nodes.
>
> IMHO, David Goodger's proposal of indenting the docstring relative to the
> attribute it refers to is a better solution.
>
> If that requires too many changes to the parser, the name variable
> should be reset for all statement nodes.
See my other mail: indenting is only allowed for blocks of
code and these are usually started with a colon -- doesn't
work here.
--
Marc-Andre Lemburg
______________________________________________________________________
Business: http://www.lemburg.com/
Python Pages: http://www.lemburg.com/python/
More information about the Python-list
mailing list