Skip to content

Make int() and str() docstrings correct #58988

Closed

Description

@terryjreedy
BPO 14783
Nosy @birkenfeld, @rhettinger, @terryjreedy, @ezio-melotti, @merwok, @asvetlov, @cjerdonek, @serhiy-storchaka
Files
  • issue14783.diff: Patch against 3.2.
  • issue-14783-1-default.patch
  • 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/ezio-melotti'
    closed_at = <Date 2012-10-08.03:42:07.788>
    created_at = <Date 2012-05-11.15:50:12.807>
    labels = ['easy', 'type-feature', 'docs']
    title = 'Make int() and str() docstrings correct'
    updated_at = <Date 2012-12-10.02:25:05.710>
    user = 'https://github.com/terryjreedy'

    bugs.python.org fields:

    activity = <Date 2012-12-10.02:25:05.710>
    actor = 'python-dev'
    assignee = 'ezio.melotti'
    closed = True
    closed_date = <Date 2012-10-08.03:42:07.788>
    closer = 'chris.jerdonek'
    components = ['Documentation']
    creation = <Date 2012-05-11.15:50:12.807>
    creator = 'terry.reedy'
    dependencies = []
    files = ['27075', '27370']
    hgrepos = []
    issue_num = 14783
    keywords = ['patch', 'easy', 'needs review']
    message_count = 22.0
    messages = ['160416', '169252', '169279', '169567', '169573', '169577', '169616', '170709', '170711', '170810', '170813', '171239', '171654', '171662', '171694', '172332', '172334', '172335', '172350', '172351', '172360', '177250']
    nosy_count = 12.0
    nosy_names = ['georg.brandl', 'rhettinger', 'terry.reedy', 'ezio.melotti', 'eric.araujo', 'cvrebert', 'asvetlov', 'chris.jerdonek', 'docs@python', 'tshepang', 'python-dev', 'serhiy.storchaka']
    pr_nums = []
    priority = 'low'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue14783'
    versions = ['Python 2.7', 'Python 3.2', 'Python 3.3', 'Python 3.4']

    Activity

    1. terryjreedy commented on May 11, 2012

      @terryjreedy
      MemberAuthor

      int.__doc__ starts "int(x[, base]) -> integer". That is not exactly correct as x is not required and base is only allowed if x is a string. The 3.3 manual fixes both problems with "int([number | string[, base]])"

      I actually think the rest of the docstring might be replaced with the more accurate and informative manual entry. It might be condensed, but I am not sure what might be omitted.

    2. rhettinger commented on Aug 28, 2012

      @rhettinger
      Contributor

      The 3.3 version has the virtue of being accurate and the vice of being confusing. In a way, it has made the docs worse for the average user of common cases.

      Is there a way to stack the alternative signatures rather than mush the various used into a single pile of mush?

      int(x=0) --> integer coercion
      int(str, base=10) --> integer converted from string in a given base
      
    3. ezio-melotti commented on Aug 28, 2012

      @ezio-melotti
      Member

      .. function:: int(n=0)
      int(s, base=10)

      should do the trick.
      +1 on using this instead of int([number | string[, base]])

    4. merwok commented on Aug 31, 2012

      @merwok
      Member

      +1! This notation helps clearing up how int, str and other constructors work.

    5. ezio-melotti commented on Aug 31, 2012

      @ezio-melotti
      Member

      Here's a patch for the signature.

    6. self-assigned this
      on Aug 31, 2012
    7. terryjreedy commented on Aug 31, 2012

      @terryjreedy
      MemberAuthor

      The large issue is documenting complex signatures that do not really fit in any of the standard one-line patterns.

      I was initially puzzled by Raymond describing the 3.3 line as 'confusing', but putting on 'newbie glasses' I see now that correctly parsing
      int([number | string[, base]])
      requires knowing that '[, option]' binds tighter than '|'. Since ',' normally has the lowest binding priority, someone who does not know the signature already (ie, a target audience member) could parse it as
      int([ (number | string) [, base]])
      rather than as intended:
      int([number | (string[, base]) ])
      So I agree that the two stacked lines in the doc patch are clearer.

      However, this issue is about the docstring. Leave it incorrect? Change it to the hard-to-parse one liner? Change it to a two-line signature also? I noticed this issue while working on IDLE tooltips, using int as a test case. They currently use only the first line of the docstring, but I have decided that they should get more when needed for C functions. (For Python functions, tooltips use inspect for the actual signature and the first docstring line only for a description.)

      The first line of the str docstring is also incorrect in that the optional parameters are only valid for first arguments that are strings.
      str(string[, encoding[, errors]]) -> str
      It needs either a '|' construction like int or another line:
      str(object)
      I prefer the latter. I revised the title to add str.__doc__ to the issue.

      While we are at it, how about
      range(stop)
      range(start, stop, [step])
      instead of the current doc and docstring signature
      range([start,] stop[, step])
      ? The current docstring is inaccurate and confusing to some. (How can there be an optional first arg and required second ? -- Answer: there can't.) The technically accurate signature is
      range(start_or_stop[, stop[, step]])
      but that has been rejected as confusing.

      The bytes and bytearrays docstrings have 5 signature lines!. (The manual gives just one which does not quite cover all cases.) So (a) there is precedent for multiple signatures in docstrings and (b) tooltips already need to grab multiple signature lines. So I think int and str (and maybe range) should use a couple of clear lines.

      If the new inspect.signature function were to give signatures for C functions, there would be no problem for tooltips, but it does not. (Can signature objects even handle multiple (or type-dependent) signatures?)

    8. changed the title [-]Update int() docstring from manual[/-] [+]Make int() and str() docstrings correct[/+] on Aug 31, 2012
    9. ezio-melotti commented on Sep 1, 2012

      @ezio-melotti
      Member

      The issues about "weird" signatures are being discussed on bpo-15831.

      However, this issue is about the docstring. Leave it incorrect?
      Change it to the hard-to-parse one liner? Change it to a
      two-line signature also?

      For the docstring it's ok to use the double signature too. The description, while not too comprehensive, is understandable.
      The description of int() in the docs is instead a bit complicated. The content is good, but IMHO it would be more understandable if it was broken down into paragraphs or into a list.

    10. serhiy-storchaka commented on Sep 19, 2012

      @serhiy-storchaka
      Member

      +.. function:: int(number=0)

      First argument is named "x".

      >>> int(number=42)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: 'number' is an invalid keyword argument for this function
      >>> int(x=42)
      42

      + int(string, base=10)

      Here can be not only string, but bytes or bytearray.

      >>> int('42', 6)
      26
      >>> int(b'42', 6)
      26
      >>> int(bytearray(b'42'), 6)
      26
    11. 1 remaining item

    12. serhiy-storchaka commented on Sep 20, 2012

      @serhiy-storchaka
      Member

      It may be worth rewrite int() and str() so that the first argument was positional-only argument?

    13. ezio-melotti commented on Sep 20, 2012

      @ezio-melotti
      Member

      That would be backward incompatible, and there might be some valid (corner) cases to pass it as a keyword. Since people are usually not supposed to use it as a keyword arg, it doesn't matter much if the name is different if that makes the docs more understandable. If someone tries to do int(number=10) and gets an error it would likely switch to the simpler int(10). If he really needs keyword args he can always check the code.

      That said, I don't have a strong opinion about this, so if people think that x should be used, it's fine with me.

    14. cjerdonek commented on Sep 25, 2012

      @cjerdonek
      Member

      To make it easier to make progress on this docstring issue, I created bpo-16036 to focus on int()'s reST documentation. (I have a comment on that aspect.) This will allow the current issue to focus on the docstring aspect.

    15. cjerdonek commented on Sep 30, 2012

      @cjerdonek
      Member

      The change for bpo-15831 contains a number of places where a single signature line was converted to multiple -- but in the docs and not the docstrings. Those instances can also be examined for this issue.

      The signature line for str() was not updated in that patch, however.

    16. cjerdonek commented on Sep 30, 2012

      @cjerdonek
      Member

      So (a) there is precedent for multiple signatures in docstrings

      For the record, this is also true of 2.7:

      http://hg.python.org/cpython/file/15fd0b4496e0/Objects/bytearrayobject.c#l2870

    17. cjerdonek commented on Oct 1, 2012

      @cjerdonek
      Member

      Attaching proposed patch. This updates the docstrings for int() and str(), as well as for range() and slice() in a similar way.

      It also makes the documentation for str() closer to that of the docstring. The documentation for int(), range(), and slice() has already been updated along the lines of this patch.

    18. cjerdonek commented on Oct 7, 2012

      @cjerdonek
      Member

      Any comments on the latest patch, in particular on the int() docstring? Especially you, Terry, as you created the issue?

    19. asvetlov commented on Oct 7, 2012

      @asvetlov
      Contributor

      LGTM

    20. terryjreedy commented on Oct 7, 2012

      @terryjreedy
      MemberAuthor

      I checked pretty carefully and it looks good to me.

    21. python-dev commented on Oct 7, 2012

      python-devmannequin
      Mannequin

      New changeset e4598364ea29 by Chris Jerdonek in branch '3.2':
      Issue bpo-14783: Improve int() docstring and also str(), range(), and slice().
      http://hg.python.org/cpython/rev/e4598364ea29

      New changeset 365da47a6dc1 by Chris Jerdonek in branch '3.3':
      Issue bpo-14783: Merge changes from 3.2.
      http://hg.python.org/cpython/rev/365da47a6dc1

      New changeset 3773c98d9da8 by Chris Jerdonek in branch 'default':
      Issue bpo-14783: Merge changes from 3.3.
      http://hg.python.org/cpython/rev/3773c98d9da8

    22. cjerdonek commented on Oct 7, 2012

      @cjerdonek
      Member

      Leaving open to backport applicable portions to 2.7. I should get to that later today.

    23. python-dev commented on Oct 8, 2012

      python-devmannequin
      Mannequin

      New changeset 3b484f53f91b by Chris Jerdonek in branch '2.7':
      Issue bpo-14783: Backport changes from 3.2.
      http://hg.python.org/cpython/rev/3b484f53f91b

    24. python-dev commented on Dec 10, 2012

      python-devmannequin
      Mannequin

      New changeset 181c170c6270 by Chris Jerdonek in branch '3.2':
      Issue bpo-16629: Fix IDLE idlelib.CallTips test. Patch by Roger Serwy.
      http://hg.python.org/cpython/rev/181c170c6270

    25. transferred this issue fromon Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    Labels

    docsDocumentation in the Doc direasytype-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions