Вообразите это:
def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa):
pass
Строка переходит эти 79 символов, таким образом, что pythonic путь - к мультилинии она?
Я делаю отступ в следующих строках на 2 уровня:
def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta,
theta, iota, kappa):
pass
Я думаю, что «питонический» способ ответа на этот вопрос - это смотреть глубже синтаксиса. Передача такого количества аргументов методу указывает на вероятную проблему с вашей объектной моделью.
Прежде всего, вам действительно нужно передать так много аргументов этому методу? Возможно, это показатель того, что работу можно было бы лучше выполнить в другом месте (с помощью объекта, который уже имеет доступ к переменным)?
Если это действительно лучшее место для метода, то могут ли некоторые из этих аргументов быть предоставлены как переменные экземпляра самого объекта (через self
)?
Если нет, можете ли вы переопределить обязанности родительского объекта, чтобы включить их?
Если нет, можете ли вы инкапсулировать любой из отдельных аргументов в составной объект, который формализует отношения между ними? Если какие-либо из аргументов имеют что-то общее, это должно быть возможно.
Если у вас есть функция, которая принимает столько переменных в качестве аргументов, последнее, о чем вам нужно беспокоиться, - это отступы
Обычно я так делаю, не знаю, лучше ли это, но работает. Поскольку мне нужно разделить строку, я делаю их одинаково длиннее (если могу):
def method(self, alpha, beta, gamma, delta, epsilon, \
zeta, eta, theta, iota, kappa):
pass
Кроме того, имея такое количество параметров, я бы порекомендовал то же, что и Дэвид, используйте * args
Я просто разбиваю на открытые скобки, как только появляется 79, вот так:
def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota,
kappa):
А когда имена слишком длинные, чтобы поместить их после открывающей скобки, я делаю это так:
x.long_function_is_long(
long_argument_is_loooooooooooooooooooooooooooooooooooooooong,
longer_argument_is_looooooooooooooooooooooooooooooooooooooooonger
)
Вы можете включить перевод строки в круглые скобки (или скобки), например,
def method(self, alpha, beta, gamma, delta, epsilon, zeta,
eta, theta, iota, kappa):
pass
(количество пробельных символов, конечно, зависит от вас)
Но в этом случае вы также можете рассмотреть
def method(self, *args):
pass
и/или
def method(self, **kwargs):
pass
в зависимости от того, как вы используете аргументы (и как вы хотите, чтобы функция вызывалась).