attrs icon indicating copy to clipboard operation
attrs copied to clipboard

Adding docstrings to classes created with `make_class`

Open znichollscr opened this issue 1 year ago • 7 comments

Hi there, I might have missed something. If I have my apologies.

My question is pretty basic: is there a way to add a docstring to class created with make_class? For example

from attrs import define

@define
class D:
    """
    Docstring
    """

# Prints out the docstring above
print(D.__doc__)

C = make_class("C", ["a", "b"])

# Prints None, which makes it seem like the docstring is unset.
# Is there a way to have the docstring be set when a class is created
# via `make_class`?
print(C.__doc__)

Thanks for any help

znichollscr avatar Jul 19 '24 15:07 znichollscr

Hmm ok, having read #8, I suspect the answer to this is that it is impossible. If any maintainers/experts think otherwise though, I'd be interested to hear their thoughts.

znichollscr avatar Jul 19 '24 15:07 znichollscr

You can wrap make_class with your own function and set the docstring yourself. It's only a matter of C.__doc__ = "docstring", right?

Tinche avatar Jul 19 '24 15:07 Tinche

You can wrap make_class with your own function and set the docstring yourself. It's only a matter of C.doc = "docstring", right?

I'm not sure that works in all cases (at least #8 discusses lots of cases where it appears more complex), but that is certainly a possible workaround.

znichollscr avatar Jul 19 '24 15:07 znichollscr

If I remember correctly, just attaching __doc__ to something doesn't work. But I'm open to be proven wrong here.

hynek avatar Jul 24 '24 07:07 hynek

also #1294 seems to be tangentially related

hynek avatar Jul 24 '24 07:07 hynek

Passing class_body= {"__doc__": "doc string"} to make_class seems to set the doc string correctly.

thanegill avatar Apr 25 '25 22:04 thanegill

oh nice, assigning works too, btw. I tried both and then called help() on them.

looks like this behavior changed since Python 2 because there it doesn't:

>>> C.__doc__ = "foo"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: attribute '__doc__' of 'type' objects is not writable

this means we could move a nontrivial number of issues forward if people care enough about these topics?

hynek avatar May 01 '25 11:05 hynek