Need help with add-trailing-comma?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

asottile
203 Stars 14 Forks MIT License 294 Commits 1 Opened issues

Description

A tool (and pre-commit hook) to automatically add trailing commas to calls and literals.

Services available

!
?

Need anything else?

Contributors list

# 9,754
linter-...
pre-com...
jython
travis
128 commits
# 169,447
Git
stopwat...
Go
monolit...
5 commits
# 452,208
pre-com...
HTML
CSS
static-...
1 commit
# 2,264
Flask
python-...
python-...
repl
1 commit
# 76,980
pre-com...
Git
Objecti...
procfil...
1 commit
# 10,206
Django
Algolia
reprodu...
Common ...
1 commit
# 38,768
functio...
functio...
cpluspl...
Tensorf...
1 commit
# 20,437
pre-com...
C
Docker
unix
1 commit

Build Status Azure DevOps coverage pre-commit.ci status

add-trailing-comma

A tool (and pre-commit hook) to automatically add trailing commas to calls and literals.

Installation

pip install add-trailing-comma

As a pre-commit hook

See pre-commit for instructions

Sample

.pre-commit-config.yaml
:
-   repo: https://github.com/asottile/add-trailing-comma
    rev: v2.2.1
    hooks:
    -   id: add-trailing-comma

multi-line method invocation style -- why?

# Sample of *ideal* syntax
function_call(
    argument,
    5 ** 5,
    kwarg=foo,
)
  • the initial paren is at the end of the line
  • each argument is indented one level further than the function name
  • the last parameter (unless the call contains an unpacking (
    *args
    /
    **kwargs
    )) has a trailing comma

This has the following benefits:

  • arbitrary indentation is avoided:

    # I hear you like 15 space indents
    # oh your function name changed? guess you get to reindent :)
    very_long_call(arg,
                   arg,
                   arg)
    
  • adding / removing a parameter preserves

    git blame
    and is a minimal diff:
     # with no trailing commas
     x(
    -    arg
    +    arg,
    +    arg2
     )
    
     # with trailing commas
     x(
         arg,
    +    arg2,
     )
    

Implemented features

trailing commas for function calls

 x(
     arg,
-    arg
+    arg,
 )

trailing commas for function calls with unpackings

If

--py35-plus
is passed,
add-trailing-comma
will also perform the following change:
 x(
-    *args
+    *args,
 )
 y(
-    **kwargs
+    **kwargs,
 )

Note that this would cause a

SyntaxError
in earlier python versions.

trailing commas for tuple / list / dict / set literals

 x = [
-    1, 2, 3
+    1, 2, 3,
 ]

trailing commas for function definitions

 def func(
         arg1,
-        arg2
+        arg2,
 ):
 async def func(
         arg1,
-        arg2
+        arg2,
 ):

trailing commas for function definitions with unpacking arguments

If

--py36-plus
is passed,
add-trailing-comma
will also perform the following change:
 def f(
-    *args
+    *args,
 ): pass


def g(

  • **kwargs
  • **kwargs, ): pass

def h(

  • *, kw=1
  • *, kw=1, ): pass

Note that this would cause a

SyntaxError
in earlier python versions.

trailing commas for
from
imports

 from os import (
     path,
-    makedirs
+    makedirs,
 )

trailing comma for class definitions

 class C(
     Base1,
-    Base2
+    Base2,
 ):
     pass

trailing comma for match statement

 match x:
     case A(
        1,
-       2
+       2,
     ):
        pass
     case (
        1,
-       2
+       2,
     ):
        pass
     case [
        1,
-       2
+       2,
     ]:
        pass
     case {
        'x': 1,
-       'y': 2
+       'y': 2,
     }:
        pass

unhug trailing paren

 x(
     arg1,
-    arg2)
+    arg2,
+)

unhug leading paren

-function_name(arg1,
-              arg2)
+function_name(
+    arg1,
+    arg2,
+)

match closing brace indentation

 x = [
     1,
     2,
     3,
-    ]
+]

remove unnecessary commas

yes yes, I realize the tool is called

add-trailing-comma
:laughing:
-[1, 2, 3,]
-[1, 2, 3, ]
+[1, 2, 3]
+[1, 2, 3]

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.