Соглашения об именовании параметров для функции в Python - PullRequest
2 голосов
/ 13 августа 2011

Это не большой вопрос, но меня это беспокоит, поэтому я решил попросить вдохновения.

Предположим, функция определена следующим образом:

def store(book=None, author=None):
    pass

При вызове этой функции так:

book = Book()
author = Author()
store(book=book, author=author)

Должен ли я бояться побочных эффектов из-за book=book и author=author? Я склонен переопределить функцию на

def store(thebook=None, theauthor=None):
    pass

но это кажется немного многословным. Есть предложения?

Ответы [ 4 ]

4 голосов
/ 13 августа 2011

У вас нет побочных эффектов, чтобы бояться. Семантически не отличается от того, что было бы, если бы вы только что позвонили

store(book, author)

Значения хранятся в новых переменных внутри области действия функции, в соответствии со всеми обычными правилами области видимости Python.

Аргументы ключевых слов освобождают вас от необходимости использовать другие, более конкретные имена переменных, если вам это необходимо. Имена book и author являются довольно общими, что уместно в функции, которая должна быть многократно используемой и, следовательно, более абстрактной. Но использование более конкретных имен может быть целесообразным в пределах области вызова. С этой точки зрения thebook и theauthor на самом деле ничем не отличаются от book и author; Вы хотели бы сделать что-то более похожее - скажем - local_book или borrowed_book - или что-то более точное, чтобы описать эту книгу.

3 голосов
/ 13 августа 2011

Во-первых, в высказывании store(book=book, author=author) нет никакой двусмысленности или побочных эффектов.У интерпретатора нет проблем с произнесением имен аргументов из имен в целом.

Теперь, что касается второй части вашего вопроса, я не думаю, что вам следует изменять имена аргументов функции: в конце концов, store() выполняет свою работу с book и author, в общем смысле.

Однако ваши локальные переменные могут быть более точными относительно того, что они содержат.Они, вероятно, не ссылаются на какую-либо книгу или автора, но имеют специфические характеристики, например, например, текущую книгу или бестселлер * автора.

Итак, если вы хотите устранить неоднозначность имен, я бы посоветовал вам переименовать ваши локальные переменные.

2 голосов
/ 13 августа 2011

Нет , побочных эффектов от этого не будет.

Пространство имен переменных в , вызывающем функцию , и пространство имен параметроввнутри функции , называемой , являются отдельными и не могут влиять друг на друга.

1 голос
/ 13 августа 2011

У вас не возникнет проблем с именами параметров, совпадающими с параметрами переменных, поскольку они не анализируются одинаково:

parameters: '(' [varargslist] ')'
varargslist: ((fpdef ['=' test] ',')*
          ('*' NAME [',' '**' NAME] | '**' NAME) |
          fpdef ['=' test] (',' fpdef ['=' test])* [','])

С http://docs.python.org/reference/grammar.html

...