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

Allow trailing comma in any function argument list. #53478

Closed
mdickinson opened this issue Jul 12, 2010 · 30 comments
Closed

Allow trailing comma in any function argument list. #53478

mdickinson opened this issue Jul 12, 2010 · 30 comments
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) type-feature A feature request or enhancement

Comments

@mdickinson
Copy link
Member

BPO 9232
Nosy @gvanrossum, @loewis, @rhettinger, @mdickinson, @ncoghlan, @abalkin, @larryhastings, @ericvsmith, @rbtcollins, @Trundle, @gst, @vadmium, @phmc
Files
  • trailing_commas.patch
  • trailing_commas2.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 = None
    closed_at = <Date 2015-08-11.20:01:47.555>
    created_at = <Date 2010-07-12.14:30:16.029>
    labels = ['interpreter-core', 'type-feature']
    title = 'Allow trailing comma in any function argument list.'
    updated_at = <Date 2015-10-04.03:03:41.342>
    user = 'https://github.com/mdickinson'

    bugs.python.org fields:

    activity = <Date 2015-10-04.03:03:41.342>
    actor = 'python-dev'
    assignee = 'none'
    closed = True
    closed_date = <Date 2015-08-11.20:01:47.555>
    closer = 'rbcollins'
    components = ['Interpreter Core']
    creation = <Date 2010-07-12.14:30:16.029>
    creator = 'mark.dickinson'
    dependencies = []
    files = ['17969', '18129']
    hgrepos = []
    issue_num = 9232
    keywords = ['after moratorium']
    message_count = 30.0
    messages = ['110089', '110122', '110143', '110161', '111194', '123829', '123851', '123896', '123906', '123909', '123910', '123915', '123917', '224470', '224488', '239081', '239084', '239085', '239797', '246697', '247032', '247150', '248399', '248411', '248425', '248426', '248427', '248430', '248449', '252252']
    nosy_count = 16.0
    nosy_names = ['gvanrossum', 'loewis', 'rhettinger', 'mark.dickinson', 'ncoghlan', 'belopolsky', 'larry', 'eric.smith', 'rbcollins', 'zuo', 'Trundle', 'python-dev', 'gstarck', 'martin.panter', 'Drekin', 'pconnell']
    pr_nums = []
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue9232'
    versions = ['Python 3.6']

    @mdickinson
    Copy link
    Member Author

    Python's current grammar allows a trailing comma after the argument list in:

    def f(a, b,):
        pass

    but not in

    def f(*, a, b,):
        pass

    I propose allowing trailing commas in both situations.

    See python-dev discussion starting at

    http://mail.python.org/pipermail/python-dev/2010-July/101636.html

    @mdickinson mdickinson added interpreter-core (Objects, Python, Grammar, and Parser dirs) type-feature A feature request or enhancement labels Jul 12, 2010
    @mdickinson
    Copy link
    Member Author

    Here's a patch. I've checked with PEP-306, but besides changing Grammar, test_grammar.py and the parser module (which there's a separate issue open for), I don't think any other changes are required.

    @ncoghlan
    Copy link
    Contributor

    I take it the AST generation just throws the extra comma away? You're sure this doesn't upset any of the node counts in that stage of the compiler?

    @mdickinson
    Copy link
    Member Author

    No, I'm not sure. :) I'll double check.

    So I'm looking at ast_for_arguments and handle_keywordonly_args in ast.c. As far as I can tell, that's the only relevant bit; is there anywhere else I should be checking?

    @mdickinson mdickinson self-assigned this Jul 20, 2010
    @mdickinson
    Copy link
    Member Author

    There was one place that needed to be changed in ast.c: namely, the check to make sure that there are keyword-only arguments following a bare star.

    Here's a new patch, that fixes that issue, updates the grammar in the ast.c comment to match that in Grammar/Grammar, and also updates the production list given in the docs for function definitions.

    @loewis
    Copy link
    Mannequin

    loewis mannequin commented Dec 12, 2010

    Retargetting, as this falls under the moratorium, and also because 3.2b1 has been released.

    @loewis
    Copy link
    Mannequin

    loewis mannequin commented Dec 12, 2010

    In bpo-10682, several committers indicated that they would prefer not to change this. So I'm closing this as rejected. Per convention, it would probably require a PEP to modify Python in this aspect (as there is no clear consensus).

    @loewis loewis mannequin closed this as completed Dec 12, 2010
    @abalkin
    Copy link
    Member

    abalkin commented Dec 13, 2010

    In bpo-10682, several committers indicated that they would prefer
    not to change this.

    Issue bpo-10682 has been open for less than 24 hours before it was rejected. In contrast, this issue was open after an almost week-long discussion on python-dev where the proposal was well received.

    I think bpo-10682 should have been closed as a duplicate of this issue and this issue should be marked as "after moratorium".

    @loewis
    Copy link
    Mannequin

    loewis mannequin commented Dec 13, 2010

    I stand by my evaluation: there is clearly no consensus about this change, so it certainly requires more discussion, potentially leading to proponents being asked to write a PEP.

    @ncoghlan
    Copy link
    Contributor

    An open issue more accurately reflects the lack of consensus than a closed one, though. We just won't commit it until there *is* consensus that it is a better option than the status quo.

    @ncoghlan ncoghlan reopened this Dec 13, 2010
    @ncoghlan
    Copy link
    Contributor

    From 10682: the grammar is also inconsistent as to when trailing commas are allowed in function calls, not just definitions.

    @zuo
    Copy link
    Mannequin

    zuo mannequin commented Dec 14, 2010

    From 10682: The patch proposed in this (bpo-9232) issue does not fix call syntax but def sytax only. I think it should fix call sytax as well (see code examples in bpo-10682).

    @zuo
    Copy link
    Mannequin

    zuo mannequin commented Dec 14, 2010

    python-dev discussion continuation: http://mail.python.org/pipermail/python-dev/2010-December/106770.html

    @mdickinson mdickinson removed their assignment Mar 10, 2012
    @larryhastings
    Copy link
    Contributor

    Moratorium's long over. Will this patch rise from the dead?

    @mdickinson
    Copy link
    Member Author

    Will this patch rise from the dead?

    It's really down to getting consensus that it's a good idea. That might require another python-dev discussion.

    @vadmium
    Copy link
    Member

    vadmium commented Mar 24, 2015

    See also bpo-22942 about existing problems with the language documentation.

    I would like to see trailing commas supported consistently, especially in function calls. (I think the patch here only does function definitions?) I like to use them when writing arguments on multiple lines, and it is surprising that adding packed *positional arguments can trigger a syntax error.

    Maybe this is stretching the scope a bit too far, but it would also be nice to allow more keyword arguments after the **keyword unpacking:

    print(1, 2, end=".\n", *(3, 4))  # Supported, but confusing
    print(1, 2, *(3, 4), end=".\n")  # Better; also suported
    print(1, 2, **dict(sep="-"), end=".\n")  # Unsupported, but would be nice
    print(end=".\n", 1, 2)  # Unsupported, for good reason

    Maybe some of this is covered by bpo-2292 (generalizing * unpacking), but I haven’t been following that, so I’m not sure.

    @abalkin
    Copy link
    Member

    abalkin commented Mar 24, 2015

    @abalkin
    Copy link
    Member

    abalkin commented Mar 24, 2015

    .. and a couple more -1's on the tracker:

    msg123851 - Martin v. Löwis
    msg123848 - Brett Cannon

    It looks like a round on python-ideas is needed before this can move forward.

    @vadmium
    Copy link
    Member

    vadmium commented Apr 1, 2015

    @gst
    Copy link
    Mannequin

    gst mannequin commented Jul 13, 2015

    Have also been confronted to this bug (imo) and this happen from time to time to me :

    I often like to ends my (big) functions defs and calls (those that span over multiple lines thus..) with that extra comma,

    so that when/if I add another argument (on a new line) later then there will be only a + line in my VCS).

    There seems to have a consensus to apply the patch (unless it's not finished?)..

    regards,

    @Drekin
    Copy link
    Mannequin

    Drekin mannequin commented Jul 21, 2015

    Reposting from from my newest duplicate of this issue (bpo-24677), which is now closed:

    I think that a trailing comma in function definition should be allowed also after *.

    Current situation with definitions:
    def f(args, ): pass # SyntaxError
    def f(
    , ): pass # SyntaxError
    def f(, a, ): pass # SyntaxError
    def f(
    , a=2, ): pass # SyntaxError

    def f(a, ): pass # Ok
    def f(, ): pass # SyntaxError – this should probably stay error

    Corresponding calls:
    f(*args, ) # Ok
    f(*args, a, ) # Ok
    f(*args, a=2, ) # Ok

    f(a, ) # Ok
    f(, ) # SyntaxError – this is why the corresponding def behavior should stay

    My use case:
    def f(*,
    long = 1,
    list = 2,
    of = 3,
    kwonly = 4,
    parameters = 5,
    ):
    ...

    @rbtcollins
    Copy link
    Member

    FWIW I would like to see this, but I think it does need a PEP given the contention so far. For that, we need a BDFL delegate AIUI.

    @Drekin
    Copy link
    Mannequin

    Drekin mannequin commented Aug 11, 2015

    Some remarks:

    • A trailing comma after a non-empty argument list is allowed in every call form, including class statement and optional call in decorator syntax. In the grammar, this correponds to arglist.

    • In function definition, trailing comma is allowed only if there is no star before:
    def f(a, b, c,): # allowed
    def f(a=1, b=2, c=3,): # allowed
    def f(args,): # disallowed
    def f(**kwargs,): # disallowed
    def f(
    , a, b, c,): # disallowed
    The last example is what bothers me. The presence of the star should not affect whether trailing comma is allowed or not. If f(a, b, c,) is allowed as a call, it should be allowed in a definition, and if def f(a, b, c,) is allowed, f(*, a, b, c,) should be allowed as well.

    In the grammar this corresponds to typedargslist for functions and varargslist for lambdas.

    • A traling comma is allowed in tuples, lists, dicts, sets, the corresponding comprehensions, augmented assignments, and subscripts. It is also allowed in from module import names in the names part, but only if there are surrounding parentheses. Also a trailing semicolon is allowed for multiple statements in one line.

    • A traling comma is not allowed in with statement, import modules, assert statement (there is just optional second argument), global and nonlocal statements. In all these cases surrounding parentheses are not allowed.

    @gvanrossum
    Copy link
    Member

    I'm +1 on adding this. I don't believe it requires a PEP. A trailing comma in definitions is already supported in some places, so I don't buy the argument that it catches errors. During the moratorium we were perhaps too strict.

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Aug 11, 2015

    New changeset 419ceb531bab by Robert Collins in branch 'default':
    Issue bpo-9232: Support trailing commas in function declarations.
    https://hg.python.org/cpython/rev/419ceb531bab

    @rbtcollins
    Copy link
    Member

    The patch had some conflicts in the reference docs, I think I resolved it correctly: if someone wanted to cross check my work that would be great. However I was feeling (perhaps wrongly :)) confident so I have committed it as-is.

    @Drekin
    Copy link
    Mannequin

    Drekin mannequin commented Aug 11, 2015

    Do we want to allow a trailing comma after *args or **kwargs in a function definition? Unlike in a call, **kwargs is always the last thing in the list and nothing can be added after that. Just asking.

    @larryhastings
    Copy link
    Contributor

    With PEP-448, we can now have

        fronkulate(**kwargs, **kwargs2)

    @gvanrossum
    Copy link
    Member

    To be explicit, yes, I want to allow trailing comma even after *args or **kwds. And that's what the patch does.

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Oct 4, 2015

    New changeset 6db349fac3ec by Terry Jan Reedy in branch 'default':
    Issue bpo-9232: Escape rst markup char in NEWS entry to avoid Sphinx warning.
    https://hg.python.org/cpython/rev/6db349fac3ec

    @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
    interpreter-core (Objects, Python, Grammar, and Parser dirs) type-feature A feature request or enhancement
    Projects
    None yet
    Development

    No branches or pull requests

    7 participants