Pythonic способ писать функции / методы с большим количеством аргументов - PullRequest
9 голосов
/ 29 июня 2010

Представьте себе следующее:

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

Линия перекрывает 79 символов, так что, как питонский способ ее многострочного?

Ответы [ 6 ]

20 голосов
/ 29 июня 2010

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

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

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

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

def method(self, *args):
    pass

и / или

def method(self, **kwargs):
    pass

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

13 голосов
/ 29 июня 2010

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

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

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

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

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

6 голосов
/ 29 июня 2010

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

def method(self, alpha, beta, gamma, delta, epsilon, zeta, eta,
        theta, iota, kappa):
    pass
1 голос

Я просто разделился на открытую скобку, как только ударил 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 голос
/ 29 июня 2010

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

0 голосов
/ 29 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...