Pythonic способ записать функции/методы с большим количеством аргументов

Вообразите это:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta, theta, iota, kappa):
    pass

Строка переходит эти 79 символов, таким образом, что pythonic путь - к мультилинии она?

10
задан Ninjakannon 28 January 2019 в 12:35
поделиться

6 ответов

Я делаю отступ в следующих строках на 2 уровня:

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta,
        theta, iota, kappa):
    pass
6
ответ дан 3 December 2019 в 13:50
поделиться

Я думаю, что «питонический» способ ответа на этот вопрос - это смотреть глубже синтаксиса. Передача такого количества аргументов методу указывает на вероятную проблему с вашей объектной моделью.

  1. Прежде всего, вам действительно нужно передать так много аргументов этому методу? Возможно, это показатель того, что работу можно было бы лучше выполнить в другом месте (с помощью объекта, который уже имеет доступ к переменным)?

  2. Если это действительно лучшее место для метода, то могут ли некоторые из этих аргументов быть предоставлены как переменные экземпляра самого объекта (через self )?

  3. Если нет, можете ли вы переопределить обязанности родительского объекта, чтобы включить их?

  4. Если нет, можете ли вы инкапсулировать любой из отдельных аргументов в составной объект, который формализует отношения между ними? Если какие-либо из аргументов имеют что-то общее, это должно быть возможно.

13
ответ дан 3 December 2019 в 13:50
поделиться

Если у вас есть функция, которая принимает столько переменных в качестве аргументов, последнее, о чем вам нужно беспокоиться, - это отступы

1
ответ дан 3 December 2019 в 13:50
поделиться

Обычно я так делаю, не знаю, лучше ли это, но работает. Поскольку мне нужно разделить строку, я делаю их одинаково длиннее (если могу):

def method(self, alpha, beta, gamma, delta, epsilon, \
                 zeta, eta, theta, iota, kappa):
    pass

Кроме того, имея такое количество параметров, я бы порекомендовал то же, что и Дэвид, используйте * args

-2
ответ дан 3 December 2019 в 13:50
поделиться

Я просто разбиваю на открытые скобки, как только появляется 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
)
1
ответ дан 3 December 2019 в 13:50
поделиться

Вы можете включить перевод строки в круглые скобки (или скобки), например,

def method(self, alpha, beta, gamma, delta, epsilon, zeta,
                 eta, theta, iota, kappa):
    pass

(количество пробельных символов, конечно, зависит от вас)

Но в этом случае вы также можете рассмотреть

def method(self, *args):
    pass

и/или

def method(self, **kwargs):
    pass

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

21
ответ дан 3 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: