0

Следует ли добавлять запятую после последнего аргумента в вызове функции? [закрыто]

15

Проблема с использованием запятой в вызовах функций в Python

Я столкнулся с вопросом о том, как правильно форматировать вызов функции в Python, особенно в отношении использования завершающей запятой. Рассмотрим следующие примеры:

  1. Что лучше использовать?

    self.call(1, True, "hi")
    

    или

    self.call(1, True, "hi",)
    
  2. Как быть в следующем случае:

    self.call(
        1,
        True,
        "hi"
    )
    

    или

    self.call(
        1,
        True,
        "hi",
    )
    

Я понимаю, что в некоторых структурах данных добавление завершающей запятой имеет свои плюсы, но как это касается вызовов функций?

Объясните, что лучше использовать: завершающую запятую или нет, и в чем могут быть отличия? Ваши мнения и примеры будут очень полезны!

3 ответ(ов)

0

Использование запятых в конце аргументов функций не имеет технических ограничений, но некоторым пользователям они могут показаться отвлекающими. Некоторые могут задаться вопросом: Хмм, эта запятая должна там быть?

Одним из эффектов использования запятых в конце аргументов в сочетании с отступами является то, что изменения в системах контроля версий выглядят чуть аккуратнее при добавлении новых аргументов.

Например, функция вида:

def my_fun(a, b, c=None):
    ...

...вызываемая вот так:

my_fun(
    a='abc',
    b=123
)

...после изменения на:

my_fun(
    a='abc',
    b=123,
    c='def'
)

выдаст следующее отличие в git:

$ git diff
...
 my_fun(
     a='abc',
-    b=123
+    b=123,
+    c='def'
 )

В то время как:

my_fun(
    a='abc',
    b=123,
)

при изменении на:

my_fun(
    a='abc',
    b=123,
    c='def',
)

приведёт к такому отличию в git:

$ git diff
...
 my_fun(
     a='abc',
     b=123,
+    c='def',
 )

Таким образом, использование завершающих запятых может упростить визуальное восприятие изменений в коде при использовании систем контроля версий.

0

Трейлингующая запятая действительно может быть полезной в структурах данных, так как упрощает добавление новых элементов в списки. Например:

a = [
      1,
      2,
      3,
    ]

С лёгкостью можно изменить его на:

a = [
      1,
      2,
      3,
      4,
      5,
    ]

В этом случае вам не нужно редактировать строку с 3,, что делает процесс добавления элементов более удобным.

Однако в случае с вызовами функций, как правило, длина аргументов не меняется, поэтому полезность трейлингующей запятой здесь не столь очевидна. Вызовы функций обычно имеют фиксированное количество аргументов, и частое изменение их числа маловероятно. Поэтому я бы не рекомендовал использовать трейлингующие запятые в вызовах функций. Это может даже привести к путанице, особенно для тех, кто читает код.

0

Это специфично для инструмента, но на самом деле упрощает рефакторинг кода в vim/Gvim, даже если речь идет о списках параметров функции в одну строку.

Например, у вас есть функция:

def foo( a, b, c, e, d, ):

и вы хотите изменить ее на:

def foo( a, b, c, d, e, ):

Используя vim, вы можете просто удалить "e," или "d," всего лишь двумя нажатиями клавиш (dW), затем переместиться туда, куда хотите вставить его, и нажать (p).

Если бы у вас не было заключительной запятой, вам пришлось бы удалять ее из вашего нового последнего элемента и добавлять к старому последнему элементу. В противном случае вам бы пришлось быть более осторожным, удаляя только до запятой и вставляя более точно. С запятыми повсюду вы можете рассматривать все как единообразные части, которые можно легко менять местами.

Vim, как оказывается, довольно популярен среди писателей на Python, так что это действительно имеет смысл: https://www.sitepoint.com/which-code-editors-do-pythonists-use/

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь