-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Black should have an opinion about doc strings #144
Comments
I will suggest my opinion: """One-liner. Continuation for the one-liner. (Optional) Title: Note: And also: |
So I came here to complain that docstrings are out of scope but reading your comment actually makes me think what you're asking for is reasonable 😄 Specifically:
I'll think about possible negative effects some more before deciding whether to do this for sure but it looks like some opinions here might be harmless. @carljm, what do you think? |
I think it's reasonable for Black to be opinionated about this, and I think the two rules you named are the right ones to enforce. I would extend the second rule to also have an opinion about opening quotes; I slightly prefer both opening and closing quotes on their own line for a multi-line docstring, but wouldn't object to either variant. I'm not sure why, but I feel like consistent docstring formatting actually has a huge impact on whether code feels consistently formatted. I guess because they tend to be visibly syntax-highlighted large blocks of text. |
I tend to favor single line where applicable: def somefunc():
"""This is my docstring""" Multi-line I'd personally prefer the first line be on a new line (i.e., |
@ambv Not sure, if anyone is looking into it. Can I give a try to this? |
Of course, go for it! |
+1 to prefer single line if possible, otherwise both opening and closing quotes on their own lines. :) |
Just to throw it out there, I personally prefer PEP 257 style, and I think that's the right thing to do if Black is aiming to follow PEP 8: """if it all fits on one line"""
"""if not: some title
more text
""" but I've seen a wide variety of other styles in the wild, including these two which I don't think have been mentioned: """ spaces either side """
"""two line one-liner
""" I do kind of like having a blank line before the closing quotes, as it makes wrapping the body of the docstring much easier in Vim, though it's probably better to write a Vim plugin that fixes this in Vim rather than influencing Black's style. |
@anowlcalledjosh PEP 257 is explicitly agnostic about the placement of opening quotes in a multi-line docstring. To quote: "The summary line may be on the same line as the opening quotes or on the next line." So Black can choose either of these and be equally PEP 257 compliant:
or
My (weak) preference for the former is based on allowing three more characters in the summary line before hitting a line-length limit. Interestingly, on the question of blank line before closing quotes, PEP257 requires it on class docstrings but not function docstrings ("Insert a blank line after all docstrings (one-line or multi-line) that document a class") because the docstring should be spaced from the first method. Black also adds a blank line (outside the docstring) before the initial method, though, which PEP257 probably doesn't anticipate. (EDIT on second read, it's not entirely clear if the PEP means for this blank line to be inside or outside the quotes; if outside, then that matches what Black already will do.) |
From my read I thought I'm doing what the PEP is suggesting. |
I'm moderately certain PEP is telling us to add a blank line after the closing quotes |
Worth thinking about as well is that the docstring format will have impact on """
Summary line.
More lines.
""" Will produce this '\n Summary line\n\n More lines.\n ' While if you start the summary line immediately you don't get the |
@Renstrom, that used to bother me in the past when |
Support was recently merged into pycodestyle to support a doc string line length which differs from that of the code line length in PyCQA/pycodestyle#674. It'd be nice to have some tooling and an opinion around that. The primary use case is to comply with a 72 character docstring limit in pep8, but it's also immensely useful if you allow line lengths of 120 but just want to make sure your docstrings are below 80 so it plays nicely with pydoc. |
In response to #144 (comment), The blank line should be removed if it's a docstring for a function, but retained for a class. After running black on our codebase, Flake8 is complaining about
Black is inserting that blank line between the docstring first line, but shouldn't, because from PEP-257
|
Black differentiates inner functions from the rest of the body. If you had other instructions there. It wouldn't put empty lines. |
This could be tricky when writing a decorator.
Black will add a line after the docstring, causing pydocstyle to report a D202. It sounds like the way to prevent this is to put something else between the two |
For those waiting on this, docformatter might interest you: https://github.com/myint/docformatter |
Regardless of which layout you choose, I think too many debatable cases will arise if Black would try to enforce a line-length in your docstrings' bodies, for example. Some examples concerning the body text:
Gets messy real quick :) Perhaps there are too many docstring styles to enforce/output something more useful than the input in the bodies. Who knows whether someone is using Epydoc, Sphinx, Google or any other style. So I think it's best for the "opinion" of Black to stick to the bare layout, like it is above (with an option to turn doc formatting off). And trailing whitespace could be trimmed without causing trouble AFAIK. My preference would be one-liners and |
I've implemented docstring indent fixing in my fork. |
OK, next topic. Is should Black have an opinion on parameter documentation? E.g. def func(param1, param2):
"""
This is a reST style.
:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""
pass More styles here: https://stackoverflow.com/a/24385103 |
I personally found reST much harder to deal with than MD and with the introduction of type hints the need to follow its param docs seems to create undesired repetition. Sphinx itself seems to now have support for https://www.sphinx-doc.org/en/master/usage/markdown.html but I am not sure if it can be used as a replacement (i plan to test that). What I wanted to point with that is that the future of documentation format is far from clearn. Still, this does not mean we should not work towards addressing it. There are lots of steps that would apply regardless which formats will gain more traction. |
I would say that core black should not have an opinion on docstring style (reST, NumpyDoc, Google, etc.). If anything, docstring style adjustments could be an optional plugin/add-on or even an entirely separate package. Note that there's already |
Using both
|
Note that there are situations where an opinion inside Given
This might be a separate concern. |
That has been fixed on master already: (black) richard-26@ubuntu-laptop:~/programming/black$ black test.py --diff --color
--- test.py 2020-06-15 21:12:39.234785 +0000
+++ test.py 2020-06-15 21:12:48.966120 +0000
@@ -1,6 +1,6 @@
def some_functions(args):
- """ this is a test
- of some long docstrings
- which go into multiple lines
- """
- pass
+ """this is a test
+ of some long docstrings
+ which go into multiple lines
+ """
+ pass
would reformat test.py
All done! ✨ 🍰 ✨
1 file would be reformatted.
|
There are three separate standards. Restructured Using black shouldn't decide what integrations you're able to use. |
Black now has plenty opinions about docstrings (#1053) and this issue is long enough. If you feel that Black has the wrong opinion, or that it should have opinions about more aspects of docstrings, feel free to open a new issue. |
Should we re-open #745 then? The discussion was supposed to be moved here, but as far as I see no decision has been reached yet. |
Really wish I had seen this issue a few months ago. Lots of other tools process docstrings, and have their own expectations. black should stick to code formatting, and not be in the business of modifying docstrings in any way. |
I've got a code base of some 10000 lines of code I'm maintaining on my own. I've just stumbled across the idea of autoformatting with black, and I'm fine with it's extra long line lengths. My only concern is that all my docstrings will remain < 80 characters per line. I suppose this isn't really related to the issue at hand per se, but I definitely think that Black should be in the business of reformatting docstrings, although I'm not sure to what extent. |
I personally prefer this docstring format: class SimpleClass:
"""Create a simple class."""
def __init__(self):
"""Initialize specific attributes for the simple class."""
self.first_attribute = 1
self.second_attribute = 2
def sum_of_attributes(self):
"""
Return the result of summing the values of this class' attributes.
> Sum first_attribute and second_attribute.
> Return the result of the summing calculation.
"""
sum_calculation = self.first_attribute + self.second_attribute
return sum_calculation |
It seems Black isn't compatible with latest Docformatter (PyCQA/docformatter#94), because it removes the empty line after block docstrings. (Though also my personal preference would be to keep them) |
Operating system: Ubuntu 16.04
Python version: 3.6.1
Black version: master
Does also happen on master: yes
Hi,
currently Black doesn't seem to have an opinion about doc strings or rather where the quotes should go.
Black claims for this file for example that it is already formatted:
The tool pydocstyle (in the spirit of PEP-0257) at least complains that the closing quotes should go on a separate line and if the docstring fits one line it should only span one line.
It would be nice if that could be incorporated in Black as well.
Thanks for the great work!
Lukas.
The text was updated successfully, but these errors were encountered: