[Python-Dev] Re: [PEP 224] Attribute Docstrings

Christian Tanzer tanzer@swing.co.at
Mon, 28 Aug 2000 08:32:17 +0200


"M.-A. Lemburg" <mal@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 =3D 1
>             "attribute C.a doc-string (1)"
> =

>             b =3D 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.

>     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@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

>     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.

>     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 =3D 2
> =

>             def x(self):
>                 "C.x doc string"
>                 y =3D 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?

For instance,

    def spam():
        a =3D 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.

Hoping-to-use-attribute-docstrings-soon ly,
Christian

-- =

Christian Tanzer                                         tanzer@swing.co.=
at
Glasauergasse 32                                       Tel: +43 1 876 62 =
36
A-1130 Vienna, Austria                                 Fax: +43 1 877 66 =
92