Skip to content
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

Closed
terryjreedy opened this issue Dec 14, 2013 · 26 comments
Closed

Improve help('non-topic') response #64179

terryjreedy opened this issue Dec 14, 2013 · 26 comments
Assignees
Labels
docs Documentation in the Doc dir stdlib Python modules in the Lib dir type-feature A feature request or enhancement

Comments

@terryjreedy
Copy link
Member

BPO 19980
Nosy @terryjreedy, @ezio-melotti, @elias6, @zware, @serhiy-storchaka
Files
  • help-response.patch: Improve help('non-topic') response
  • empty-help-response.patch: Issue 19980: Show error message when help('') is run from interactive prompt.
  • issue19980.patch
  • Issue19980.diff: Change following review
  • issue19880v3.diff: Fixed line endings problem.
  • issue19880v4.diff
  • 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:

    assignee = 'https://github.com/serhiy-storchaka'
    closed_at = <Date 2015-02-28.22:46:58.200>
    created_at = <Date 2013-12-14.01:34:52.056>
    labels = ['type-feature', 'library', 'docs']
    title = "Improve help('non-topic') response"
    updated_at = <Date 2015-02-28.22:46:58.198>
    user = 'https://github.com/terryjreedy'

    bugs.python.org fields:

    activity = <Date 2015-02-28.22:46:58.198>
    actor = 'serhiy.storchaka'
    assignee = 'serhiy.storchaka'
    closed = True
    closed_date = <Date 2015-02-28.22:46:58.200>
    closer = 'serhiy.storchaka'
    components = ['Documentation', 'Library (Lib)']
    creation = <Date 2013-12-14.01:34:52.056>
    creator = 'terry.reedy'
    dependencies = []
    files = ['33251', '34281', '35472', '36141', '37565', '38279']
    hgrepos = []
    issue_num = 19980
    keywords = ['patch']
    message_count = 26.0
    messages = ['206157', '206159', '206777', '212690', '216084', '216142', '217668', '218721', '219154', '219166', '219695', '221098', '223847', '224177', '230029', '231506', '231507', '231514', '231519', '233206', '234910', '236896', '236903', '236918', '236921', '236922']
    nosy_count = 10.0
    nosy_names = ['terry.reedy', 'ezio.melotti', 'jesstess', 'docs@python', 'BreamoreBoy', 'elias', 'python-dev', 'zach.ware', 'serhiy.storchaka', 'Jessica.McKellar']
    pr_nums = []
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue19980'
    versions = ['Python 3.5']

    @terryjreedy
    Copy link
    Member Author

    >>> 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.

    @terryjreedy terryjreedy added docs Documentation in the Doc dir stdlib Python modules in the Lib dir type-feature A feature request or enhancement labels Dec 14, 2013
    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Dec 14, 2013

    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.

    @elias6
    Copy link
    Mannequin

    elias6 mannequin commented Dec 21, 2013

    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.

    @elias6
    Copy link
    Mannequin

    elias6 mannequin commented Mar 4, 2014

    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.

    @JessicaMcKellar
    Copy link
    Mannequin

    JessicaMcKellar mannequin commented Apr 14, 2014

    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:

    Try help('help') for information on recognized strings or help(str) for help on the str class.

    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.

    @terryjreedy
    Copy link
    Member Author

    help() uses lib/pydoc.py and pydoc tests are in test/test_pydoc.py
    I think tests for things help does that pydoc does not do (help on topics?) should be in site.py.

    @elias6
    Copy link
    Mannequin

    elias6 mannequin commented May 1, 2014

    Sorry for the late response but I have been busy with various things. I may
    be able to work on this but I don't know when or how long it will take me.
    I would suggest that someone else work on it if anyone wants it done any
    time soon. I am sorry about this.

    On Mon, Apr 14, 2014 at 7:43 AM, Jessica McKellar <report@bugs.python.org>wrote:

    Jessica McKellar added the comment:

    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:

    > Try help('help') for information on recognized strings or help(str) for
    help on the str class.

    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.

    ----------
    nosy: +Jessica.McKellar, jesstess


    Python tracker <report@bugs.python.org>
    <http://bugs.python.org/issue19980\>


    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented May 17, 2014

    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.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented May 26, 2014

    Anybody?

    @jesstess
    Copy link
    Member

    @breamoreboy, thanks for following up on this!

    I propose the following. help('') returns help on strings in the same way that help([]) and help({}) returns help on lists and dicts respectively,

    Sounds good.

    further help(''.method) returns help on the string method or an attribute error, so this appears to me consistent.

    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).

    help('doh') returns enhanced output along the lines Terry suggested in msg206157.

    Sounds good.

    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.

    I think you are stating the current functionality?

    Note that I've tried looking at the test code and it didn't make much sense to me, pointers welcome.

    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.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Jun 3, 2014

    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.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Jun 20, 2014

    Can somebody set the stage to patch review and give my patch the once over please, thanks.

    @zware
    Copy link
    Member

    zware commented Jul 24, 2014

    Mark, would you like to update your patch to address my review comments?

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Jul 28, 2014

    I suppose that technically this can only go into 3.5, but is there any real reason that this couldn't be backported?

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Oct 26, 2014

    ping.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Nov 22, 2014

    Anybody?

    @zware
    Copy link
    Member

    zware commented Nov 22, 2014

    Mark, did you test your latest patch?

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Nov 22, 2014

    Did I test the last patch? I would hope so but I simply can't remember as it's nearly four months ago, sorry :(

    @zware
    Copy link
    Member

    zware commented Nov 22, 2014

    In that case, it would be good to make sure it still applies and passes the
    tests. Last time I tried it didn't, and I was called away before I could
    leave a note to that effect (for which I am sorry). However, I don't have
    a strong enough opinion on this issue for me to have fixed your patch or
    even to have kept it in mind to come back to later.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Dec 30, 2014

    I screwed up, sorry folks. If the latest patch isn't correct I give up as it's three strikes and I'm out :(

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Jan 28, 2015

    Ping.

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Feb 28, 2015

    Pang :(

    @serhiy-storchaka
    Copy link
    Member

    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:
    |
    | __dict__
    | dictionary for instance variables (if defined)
    |
    | __weakref__
    | list of weak references to the object (if defined)

    >> help()

    Welcome to Python 3.5's help utility!

    If this is your first time using Python, you should definitely check out
    the tutorial on the Internet at http://docs.python.org/3.5/tutorial/.

    Enter the name of any module, keyword, or topic to get help on writing
    Python programs and using Python modules. To quit this help utility and
    return to the interpreter, just type "quit".

    To get a list of available modules, keywords, symbols, or topics, type
    "modules", "keywords", "symbols", or "topics". Each module also comes
    with a one-line summary of what it does; to list the modules whose name
    or summary contain a given string such as "spam", type "modules spam".

    help> help

    Welcome to Python 3.5's help utility!

    If this is your first time using Python, you should definitely check out
    the tutorial on the Internet at http://docs.python.org/3.5/tutorial/.

    Enter the name of any module, keyword, or topic to get help on writing
    Python programs and using Python modules. To quit this help utility and
    return to the interpreter, just type "quit".

    To get a list of available modules, keywords, symbols, or topics, type
    "modules", "keywords", "symbols", or "topics". Each module also comes
    with a one-line summary of what it does; to list the modules whose name
    or summary contain a given string such as "spam", type "modules spam".
    help>

    @BreamoreBoy
    Copy link
    Mannequin

    BreamoreBoy mannequin commented Feb 28, 2015

    LGTM.

    I noticed this running the tests.

    test_modules (test.test_pydoc.PydocImportTest) ... skipped 'causes undesireable side-effects (bpo-20128)'
    test_modules_search (test.test_pydoc.PydocImportTest) ... skipped 'causes undesireable side-effects (bpo-20128)'
    test_modules_search_builtin (test.test_pydoc.PydocImportTest) ... skipped 'some buildbots are not cooperating (bpo-20128)'

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Feb 28, 2015

    New changeset 4a1fe339dcf6 by Serhiy Storchaka in branch 'default':
    Issue bpo-19980: Improved help() for non-recognized strings. help('') now
    https://hg.python.org/cpython/rev/4a1fe339dcf6

    @serhiy-storchaka
    Copy link
    Member

    Thank you for your contribution Mark.

    I noticed this running the tests.

    This is temporary OK.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    docs Documentation in the Doc dir stdlib Python modules in the Lib dir type-feature A feature request or enhancement
    Projects
    None yet
    Development

    No branches or pull requests

    4 participants