Следует ли добавлять запятую после последнего аргумента в вызове функции? [закрыто]
Проблема с использованием запятой в вызовах функций в Python
Я столкнулся с вопросом о том, как правильно форматировать вызов функции в Python, особенно в отношении использования завершающей запятой. Рассмотрим следующие примеры:
Что лучше использовать?
self.call(1, True, "hi")
или
self.call(1, True, "hi",)
Как быть в следующем случае:
self.call( 1, True, "hi" )
или
self.call( 1, True, "hi", )
Я понимаю, что в некоторых структурах данных добавление завершающей запятой имеет свои плюсы, но как это касается вызовов функций?
Объясните, что лучше использовать: завершающую запятую или нет, и в чем могут быть отличия? Ваши мнения и примеры будут очень полезны!
3 ответ(ов)
Использование запятых в конце аргументов функций не имеет технических ограничений, но некоторым пользователям они могут показаться отвлекающими. Некоторые могут задаться вопросом: Хмм, эта запятая должна там быть?
Одним из эффектов использования запятых в конце аргументов в сочетании с отступами является то, что изменения в системах контроля версий выглядят чуть аккуратнее при добавлении новых аргументов.
Например, функция вида:
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',
)
Таким образом, использование завершающих запятых может упростить визуальное восприятие изменений в коде при использовании систем контроля версий.
Трейлингующая запятая действительно может быть полезной в структурах данных, так как упрощает добавление новых элементов в списки. Например:
a = [
1,
2,
3,
]
С лёгкостью можно изменить его на:
a = [
1,
2,
3,
4,
5,
]
В этом случае вам не нужно редактировать строку с 3,
, что делает процесс добавления элементов более удобным.
Однако в случае с вызовами функций, как правило, длина аргументов не меняется, поэтому полезность трейлингующей запятой здесь не столь очевидна. Вызовы функций обычно имеют фиксированное количество аргументов, и частое изменение их числа маловероятно. Поэтому я бы не рекомендовал использовать трейлингующие запятые в вызовах функций. Это может даже привести к путанице, особенно для тех, кто читает код.
Это специфично для инструмента, но на самом деле упрощает рефакторинг кода в 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/
Как получить исходный код функции Python?
Декораторы с параметрами?
Как вызвать функцию из другого .py файла?
Почему у некоторых функций есть двойные подчеркивания "__" перед и после имени функции?
Инициализация/декларация атрибутов в классе Python: где их размещать?