2016-05-10 6 views
9

Я работаю над проектом, который почти везде аргументы передаются ключом. Существуют только функции с позиционными параметрами, с параметрами ключевого слова (по умолчанию) или их сочетанием. Например, следующая функция:Что такое pythonic способ передать аргументы функции?

def complete_task(activity_task, message=None, data=None): 
    pass 

Эта функция в текущем коде будет называться так:

complete_task(activity_task=activity_task, message="My massage", data=task_data) 

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

complete_task(activity_task, "My message", task_data) 

В некоторых случаях, когда не ясно, что аргумент вызова от контекста, или вывести из имен переменных, я мог бы сделать:

complete_task(activity_task, message="success", task_data=json_dump) 

Так мне стало интересно, существует ли соглашение или «питонический» способ вызова функций с параметрами positional/keyword, , когда нет необходимости переупорядочивать аргументы метода или использовать значения по умолчанию для некоторых параметров ключевого слова.

+3

Вы смешиваете функции с методами. Все в вашем посте - это функция, а не метод. –

+2

@TomKarzes: Meh, Python вряд ли различает эти вещи. Метод - это «просто» функция, которая, как оказывается, привязана к классу (и получает доступ к нему). – Kevin

+0

@TomKarzes Извините, я поправил себя. Я имел в виду «методы», потому что большинство случаев в проекте являются реальными методами, но для простого примера выше я написал его как функцию. Тем не менее, все остальное в вопросе, который, как мне кажется, относится к одному и тому же. – ddinchev

ответ

4

обычные правила большого пальца я следую являются:

  1. Booleans, в частности, логические литералы, всегда должны быть переданы по ключевому слову, если это не действительно очевидно, что они означают. Это достаточно важно, что я часто делаю логическое ключевое слово только при написании собственных функций. Если у вас есть логический параметр, ваша функция может быть разделена на две более мелкие функции, особенно если она занимает общую структуру if boolean_parameter: do_something(); else: do_something_entirely_different().
  2. Если функция принимает множество необязательных параметров (более ~ 3, включая требуемые параметры), то опции обычно должны передаваться по ключевому слову. Но если у вас много параметров, ваша функция может быть реорганизована в несколько меньших функций.
  3. Если функция принимает несколько параметров одного и того же типа, они, вероятно, хотят быть переданы как аргументы ключевого слова, если только порядок не будет полностью очевиден из контекста (например, src до dest).
  4. В большинстве случаев аргументы с ключевыми словами не являются ошибочными. Если у вас есть случай, когда позиционные аргументы сбивают с толку, вы должны использовать аргументы ключевых слов без второй мысли. Возможно, за исключением простых функций одного параметра, аргументы ключевого слова не сделают ваш код труднее для чтения.
1

У Python есть два типа аргументов: . positional и ключевое слово (aka default). Воды получить немного мутная, потому что позиционные аргументы могут быть вызваны по ключевому слову и ключевые аргументы можно назвать позицией ...

def foo(a, b=1): 
    print(a, b) 

foo(1, 2) 
foo(a=1, b=2) 

С учетом сказанного, я думаю, что имена типов аргументов следует указать как вы должны (обычно) использовать их. В большинстве случаев я вижу позиционные аргументы, вызванные аргументами позиции и ключевого слова, называемыми ключевым словом. Итак, если вы ищете общее эмпирическое правило, я бы посоветовал вам заставить вызов функции имитировать подпись.В случае нашей выше foo функции, я бы назвал это так:

foo(1, b=2) 

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

def foo(a, aa='1', b=2): 
    print(a, aa, b) 

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

До сих пор так хорошо. Но какие правила следует использовать при создании функции? Как вы узнаете, следует ли аргументировать аргумент default или аргумент positional? Это разумный вопрос. И трудно найти хорошее эмпирическое правило. Правила, которые я использую, следующие:

  1. Будьте в курсе остальной части проекта. Это трудно сделать правильно, если вы делаете что-то другое, чем остальная часть окружающего кода.
  2. Сделать аргумент аргументом default, если (и только если) можно предоставить разумное значение по умолчанию. Если функция не будет выполнена, если пользователь не предоставит конкретный аргумент (потому что нет хорошего значения по умолчанию), тогда он должен быть позиционным.

Python3.x также имеет ключевое слово только аргументы. Те не дают вам выбора, поэтому я не знаю, что они добавляют слишком к обсуждению здесь :-) - Хотя я не знаю, что я слишком часто их использовал в дикой природе ,