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
Improve help('non-topic') response #64179
Comments
>>> help(1)
# help on int
>>> help(b'a')
# help on bytes
>>> help('a')
no Python documentation found for 'a' The reason for this unhelpful response is that strings are treated differently from all other non-class objects. (msg205861 thought this a bug.) The strings value is matched against strings that would be recognized at the help> prompt given after help(). >>> help('topics')
# list of TOPICS
>>> help('LISTS')
# information about mutable sequences Suggestion: add something more about what to do. Example enhanced response: No Python documentation found for 'a'. Try help('help') for information on recognized strings or help(str) for help on the str class. I believe this could be backported since help() is intented for interactive use only. |
IMHO this must be changed. >>> help('')
# nothing!!!
>>> help('a')
Help on module a: ... I happened to have a module called a.py in the default directory. |
I have created a patch that fixes this issue that terry.reedy described. It does not fix the problem described BreamoreBoy involving the empty string. Please note that this is my first patch for Python so let me know if I am missing something or if I can do anything else to help. |
Here is a patch that addresses the empty string problem described by @breamoreboy. I am not sure if this is the best way to handle it but it is better than what we have now. |
Elias, thanks for your patch! I think it's important to add the second part of Terry's suggestion which gives the user a specific next step to take, namely:
Can you add that to your patch? Additionally, we'll want to make sure we don't accidentally break this new functionality. Can you add a few test cases, for example what happens when you run help on a module (e.g. help("os"), 2) help on an instance of a class (e.g. help(1)), and help on a string that doesn't have a special meaning, (e.g. help("abcxyz"))? I don't see any existing tests for help(), but it is an instance of site._Helper (as reported by type(help)), and site tests live in Lib/test/test_site.py. It also gets loaded into builtins, so tests could also live in Lib/test/test_builtins.py. |
help() uses lib/pydoc.py and pydoc tests are in test/test_pydoc.py |
Sorry for the late response but I have been busy with various things. I may On Mon, Apr 14, 2014 at 7:43 AM, Jessica McKellar <report@bugs.python.org>wrote:
|
I propose the following. help('') returns help on strings in the same way that help([]) and help({}) returns help on lists and dicts respectively, further help(''.method) returns help on the string method or an attribute error, so this appears to me consistent. help('doh') returns enhanced output along the lines Terry suggested in msg206157. help('module') gives the path to the module as well as the help output, if any, as I think this could be useful in cases where you're looking for problems and have a stdlib module masked by a file of your own. Thoughts? If we can come to an agreement I'll try and work up a patch. Note that I've tried looking at the test code and it didn't make much sense to me, pointers welcome. I've also just signed the contributor's agreement. |
Anybody? |
@breamoreboy, thanks for following up on this!
Sounds good.
This already happens (which I think you are saying, but it's a bit confusing in reading your message which functionality you are proposing to add and which functionality you are restating that already exists).
Sounds good.
I think you are stating the current functionality?
Do you have specific questions? Terry suggests that help() tests for functionality using pydoc live in test_pydoc.py, and that help() tests for functionality not using pydoc live in test_site.py. |
Please find attached a first pass at a patch file. Help('') produces help for the str class as discussed. I found the difference between help('help') and help() very confusing. The former produced the help output but left you at the interactive prompt, the latter took you to the help utility. Both now take you to the help utility. I've changed the test file but two test fail, here's the output from one as they're virtually identical. FAIL: test_input_strip (test.test_pydoc.PydocDocTest) Traceback (most recent call last):
File "c:\cpython\lib\test\test_pydoc.py", line 429, in test_input_strip
self.assertEqual(expected, result)
AssertionError: 'No P[49 chars]e\'.\nUse help("help") or just help() to get t[66 chars]ass.' != 'No P[49 chars]e\'.\r\nUse help("help") or just help() to get[70 chars]ass.'
- No Python documentation found for 'test.i_am_not_here'.
+ No Python documentation found for 'test.i_am_not_here'.
? +
- Use help("help") or just help() to get the interactive help utility.
+ Use help("help") or just help() to get the interactive help utility.
? +
Use help(str) for help on the str class. I can't see where the difference between the .\nUse and .\r\nUse is coming from so thought fresh eyes would do the job. |
Can somebody set the stage to patch review and give my patch the once over please, thanks. |
Mark, would you like to update your patch to address my review comments? |
I suppose that technically this can only go into 3.5, but is there any real reason that this couldn't be backported? |
ping. |
Anybody? |
Mark, did you test your latest patch? |
Did I test the last patch? I would hope so but I simply can't remember as it's nearly four months ago, sorry :( |
In that case, it would be good to make sure it still applies and passes the |
I screwed up, sorry folks. If the latest patch isn't correct I give up as it's three strikes and I'm out :( |
Ping. |
Pang :( |
There is a problem with the patch. When you are in interactive help utility, then the request 'help' runs nested interactive help utility. The difference between unpatched behavior is that now you need press Ctrl-D or 'q' twice to exit to normal Python interpreter. When you type 'help' repeatedly, your could run third, fourth, etc nested help utility. Here is modified patch. Now help('help') produces the same output as help(help), but the 'help' request in interactive help utility prints help intro message. >>> help('help')
Help on _Helper in module _sitebuiltins object: help = class _Helper(builtins.object)
| Define the builtin 'help'.
|
| This is a wrapper around pydoc.help that provides a helpful message
| when 'help' is typed at the Python interactive prompt.
|
| Calling help() at the Python prompt starts an interactive help session.
| Calling help(thing) prints help for the python object 'thing'.
|
| Methods defined here:
|
| __call__(self, *args, **kwds)
|
| __repr__(self)
|
| | Data descriptors defined here:
Welcome to Python 3.5's help utility! If this is your first time using Python, you should definitely check out Enter the name of any module, keyword, or topic to get help on writing To get a list of available modules, keywords, symbols, or topics, type help> help Welcome to Python 3.5's help utility! If this is your first time using Python, you should definitely check out Enter the name of any module, keyword, or topic to get help on writing To get a list of available modules, keywords, symbols, or topics, type |
LGTM. I noticed this running the tests. test_modules (test.test_pydoc.PydocImportTest) ... skipped 'causes undesireable side-effects (bpo-20128)' |
New changeset 4a1fe339dcf6 by Serhiy Storchaka in branch 'default': |
Thank you for your contribution Mark.
This is temporary OK. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: