classification
Title: Automatically dedent docstring constants by default
Type: enhancement Stage:
Components: Interpreter Core Versions: Python 3.9
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: gregory.p.smith, inada.naoki, mbussonn, pablogsal, remi.lapeyre
Priority: normal Keywords:

Created on 2019-05-30 18:00 by gregory.p.smith, last changed 2019-06-06 14:36 by remi.lapeyre.

Messages (4)
msg343990 - (view) Author: Gregory P. Smith (gregory.p.smith) * (Python committer) Date: 2019-05-30 18:00
I'm spawning this issue of as a separate feature from https://bugs.python.org/issue36906 (adding string dedent method and an optimization to do it at compile timer on constants).

It'd be great if docstrings were given a similar treatment.  Right now we carry the whitespace burden within the str constants for __doc__ stored in all code objects in the process.  This adds up.

This is not _quite_ the same as calling textwrap.dedent() or the upcoming str.dedent method on them at compile time.  We need to special case the first line of docstrings.  inspect.getdoc() is our library function that does this for us today.

Change of breaking things with this change?  not impossible, but extremely minor.  Something using docstrings as data _and_ depending on leading indentation whitespace preservation would not like this.  I am not aware of anything that would ever do that.
msg344128 - (view) Author: Rémi Lapeyre (remi.lapeyre) * Date: 2019-05-31 21:35
Hi, I'm working on a PR. It should be ready in a couple of days. It's more involved than what I thought as to avoid importing inspect during compilation I will probably need to port cleandoc() in C.
msg344801 - (view) Author: Inada Naoki (inada.naoki) * (Python committer) Date: 2019-06-06 11:34
How about do `inspect.cleandoc()` instead of just a dedent?
Some method has docstring like this:

    """First line

    blah blah blah blah

        example code here
    ...
    """

In such docstring, dedent can not strip indent well.

There is existing attempt (in Japanese):

https://qiita.com/hhatto/items/3da6c6820817395f2c39#%E6%84%9A%E7%9B%B4%E3%81%AB%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89
msg344819 - (view) Author: Rémi Lapeyre (remi.lapeyre) * Date: 2019-06-06 14:36
This is the function I inlined and as far as I can tell, my approach as been similar to the one you linked.

I'm still need to fix some issues as doctest was expecting to find the string before dedenting though.
History
Date User Action Args
2019-06-06 14:36:45remi.lapeyresetmessages: + msg344819
2019-06-06 11:34:15inada.naokisetnosy: + inada.naoki
messages: + msg344801
2019-05-31 21:35:08remi.lapeyresetnosy: + remi.lapeyre
messages: + msg344128
2019-05-31 21:07:25pablogsalsetnosy: + pablogsal
2019-05-31 20:09:02mbussonnsetnosy: + mbussonn
2019-05-30 18:00:00gregory.p.smithcreate