-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
DOC: add checks on the returns section in the docstrings (#23138) #23432
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
Changes from 1 commit
e0f9689
20b32e7
f2d6449
0d34a88
b09c322
a556925
a1384d4
2f3f5bf
e62de14
fdad765
58a0a91
a116a49
5ea7881
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -491,8 +491,34 @@ def validate_one(func_name): | |
errs.append('\t{}'.format(param_err)) | ||
|
||
if doc.is_function_or_method: | ||
if not doc.returns and "return" in doc.method_source: | ||
errs.append('No Returns section found') | ||
if not doc.returns: | ||
if "return" in doc.method_source: | ||
igorfassen marked this conversation as resolved.
Show resolved
Hide resolved
|
||
errs.append('No Returns section found') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @datapythonista @WillAyd : How does this validation handle situations where we use an empty (BTW, I realize that this already in the codebase, but it only struck me just now) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Afaik, in Python all the functions return I don't think the validation checks in the code whether there is a return or not. This change should be to avoid giving a name to what is being returned if it's just a single value. In my opinion, saying that the function We want to name the values returned if the return is a tuple, for example Does this make sense to you @gfyoung? Update: Just saw the code (sorry, reviewing from the phone, which is tricky). I forgot we were checking the code for a return statement. I think we should change and use a regex that doesn't capture the bare There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. so replacing (maybe I should have another look at what's in doc.method_source) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I created #23488 to take care of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we really need a regex for this? Wouldn't it just be better documented as an optional return value if such a branch is possible to hit? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure what you mean, but it's better if you mention this approach in #23488, where this will be implemented. |
||
else: | ||
returns_errs = [] | ||
if len(doc.returns) == 1 and doc.returns[0][1]: | ||
returns_errs.append('No name is to be provided when ' | ||
'returning a single value.') | ||
igorfassen marked this conversation as resolved.
Show resolved
Hide resolved
|
||
for name, type_, desc in doc.returns: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is the value of I'd still like to have the names of the return fields that are failing in the returned error messages, and not give the user something like:
@WillAyd can you propose your preferred solution for this? For me the best would be the original one:
I think with the way it is implemented now it should be perfectly readable. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. when there is a single return and the first line is correctly written (ie no name is given), There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd prefer to rename There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm totally indifferent as I really think this is an edge case. Whatever can be done simply and accurately works for me! |
||
desc = ''.join(desc) | ||
name = '"' + name + '" ' if type_ else '' | ||
igorfassen marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if not desc: | ||
returns_errs.append('Return value {}has no ' | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm so is the assumption here that There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. there should not be any trailing space in
actually, the main problem I see here is that in the case of multiple returned values, if one of them has no name or type, the error message will not specify where the problem is :
will cause the following errors :
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would be fine with a more generic error message then that doesn't use the name if it simplifies the code. The instances where multiple values are returned is few and far between to begin with so it shouldn't be hard as an end user to recognize where the issue appears if it comes up There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. in b09c322, I've removed value names from the error messages (and prevented from printing duplicate error messages)... but I'm not sure wether this simplifies the code... |
||
'description'.format(name)) | ||
else: | ||
if not desc[0].isupper(): | ||
returns_errs.append('Return value {}description ' | ||
'should start with a capital ' | ||
'letter'.format(name)) | ||
if desc[-1] != '.': | ||
returns_errs.append('Return value {}description ' | ||
'should finish with ' | ||
'"."'.format(name)) | ||
if returns_errs: | ||
errs.append('Errors in returns section') | ||
igorfassen marked this conversation as resolved.
Show resolved
Hide resolved
|
||
for returns_err in returns_errs: | ||
errs.append('\t{}'.format(returns_err)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I find this better as is. Appending seems more idiomatic than adding an intermediary list comp |
||
|
||
if not doc.yields and "yield" in doc.method_source: | ||
errs.append('No Yields section found') | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can test this now. I guess we can't know whether we're missing the type or the description. We should return a message that considers both, so the user always know what to do. And test this case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
indeed, with the current modifications, in this case the error message is Return value has no description
should I replace it by something like Return value has no type or description ?
(well, in the case where a tuple is returned, that would mean that both type and name are missing)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
while writing that, I realize that I do not check, in the case of multiple return values, if all of them have both a name and a type