Я запутался в выборе имен для своих функций в Python . Иногда Python встроенных функций являются императивом , таких как: print
функции и метод строки find
. Иногда они не такие, как: len
его имя не является обязательным, как calculate_len
, например, и type
не является find_type
.
Я могу понять, что print
возвращает значение, которое мы не используем (то есть None
) и что-то делает (т.е. показывает строку на экране), поэтому его имя является обязательным.
Но len
возвращает значение, которое мы используем, и что-то делает (т. Е. Вычисляет, сколько элементов содержится в последовательности или отображении), и его имя не обязательно . С другой стороны, find
строковый метод (as len
) возвращает значение, которое мы используем, и что-то делает, и его имя обязательно .
Что заставило задать этот вопрос, так это то, что я поставил скрипт, который шифрует и дешифрует строку с использованием шифра Цезаря, для проверки. Рецензент сказал, что:
Просто интуитивное чувство: функции делают вещи. Поэтому хорошее имя для функции является обязательным: я бы использовал
rotate_letter
вместоrotated_letter
.
rotated_letter
возвращает однобуквенную строку, представляющую букву, повернутую на число. Я не знаю, что лучше, я использовал, rotated_letter
поскольку он возвращает значение, как randint
функция в случайном модуле , это не так generate_randint
.
Итак, в этом случае, как я должен назвать функцию, которая возвращает значение, которое будет использоваться? Должен ли я сделать имя обязательным или просто существительным . В других случаях очевидно, как это сделать, например, булевы функции , такие как, is_even
и is_palindrome
мы просто делаем это как вопрос «да / нет» , а также функции, которые просто делают и возвращают неиспользуемые значения (то есть None
), такие как print
и метод списка sort
,
источник
len
Например, о нем лучше думать как о «длине» - вы получаете метауровневое описание его аргумента.Ответы:
Используйте глаголы, если это разумно, существительные, если они короче и однозначны
В большинстве случаев функции должны быть (обязательными) глаголами и классами, переменные и параметры должны быть существительными. Атрибутами также должны быть существительные, в том числе созданные с использованием
@property
. Это особенно касается функций, которые имеют побочные эффекты. [1] Если функция что-то возвращает, вы должны оценить, добавляет ли глагол что-то или это просто «шум»:make_list(foo)
vslist(foo)
.: существительное легче читать, чем глагол. Кроме того,list
это на самом деле класс, и классы должны быть существительными.open(foo)
vsfile(foo)
.: глагол легче читать, чем существительное, и имеет больше смысла давать «варианты» глаголу, чем существительному, поэтому существительное было удалено в Python 3.open()
остается единственным «стандартным» способом [2] создавать файловые объекты в Python 3.foo.get_bar()
vs.foo.bar()
противfoo.bar
(предположим,foo
иbar
оба существительные): первый вариант правильный, потому что «get» не добавляет ничего, чего мы еще не знали. Второе уместно, еслиbar
выход изfoo
- это потенциально дорогостоящая операция и / или сопряженная с побочными эффектами (вы также можете рассмотретьBar(foo)
,Bar
является ли класс). Третий вариант подходит, если это дешевая операция без побочных эффектов, а альтернативные реализации вряд ли сделают ее дорогой .xs.sort()
vs.sorted(xs)
ifxs
- это список: первое обязательно: отсортируйте список. Он изменяет список на месте и ничего не возвращает. Второй - декларативный: список, который отсортирован, и это именно то, что он возвращает. Оба глаголы.[1]: Обычно возвращение значения и наличие побочных эффектов являются взаимоисключающими, если только у вас нет веских причин для их объединения. Таким образом, функция, которая имеет побочные эффекты, вероятно, не должна ничего возвращать, и, следовательно, превращение ее в существительное будет иметь мало смысла.
[2]: В
io
модуле есть несколько операций среднего уровня, которые можно использовать для добавления или удаления буферизации файлов, автоматического кодирования / декодирования текста и т. Д., И в основном это существительные, поскольку они являются объектно-ориентированными классами. Большинству пользователей не нужно играть с этими вещами напрямую; вместо этогоopen()
выбирает соответствующий класс и создает его автоматически.источник
foo.get_bar()
vs.` foo.bar ()` vs.foo.bar
"в чем разница между вторым и третьим ?rotated_letter
императив и держать его декларативным, верно?letter
подразумевается ли это под контекстом.list
- классrotated_letter
не похоже на метод. Это похоже на собственность. Это означает, что первая идея заключается в следующем:ожидая
letter
содержать значение типа string, а не функцию. Оттуда вы либо выбрали другое имя, например:или вместо этого вы используете свойство:
len
иtype
названы так, потому что любое другое имя будет длинным для ввода. Они часто используются и имеют особый статус основных функций Python, которые каждый учитель Python узнает в любом случае, что делает их имена гораздо более неактуальными, чем имена сторонних библиотек.len
особенно хороший пример того, что вы не должны делать в своем коде: вы должны использовать полные имена, такие какlength
(если короткая форма не очень популярна, напримерmax
), и использовать глагол, напримерcompute_length
. Или это может быть собственность:len([1, 5, 6])
становится[1, 5, 6].length
. Например, в C #, используется поздняя форма:new [] { ... }.Length
.Обратите внимание, что могут быть и исторические причины
len
: другие языки, такие как C #, предпочтительнееCount
, что обычно является методом (хотя, к сожалению, поведение несовместимо с .NET Framework).Count
это глагол, так что интуитивно вы склонны вызывать его как метод.Возврат значений или выполнение действия
Функция всегда должна выполнять действие. Если он едва возвращает значение, это должно быть свойство. У вас есть подсказка, что функция должна быть преобразована в свойство, когда:
Функция едва содержит
return ...
утверждение,Название функции, которое естественно приходит вам на ум
get_something
, как и вproduct.get_price()
.Теперь, если у вас есть функция, она может быть одного из четырех типов:
Это может быть чисто, то есть возвращать значение, не влияя на окружающую среду. Пример:
road.measure_distance()
.Это может повлиять на окружающую среду, ничего не возвращая. Пример:
product_database.remove_record(1234)
.Это может повлиять на окружающую среду и вернуть значение. Пример:
value.increment()
используется какvalue++
.Он ничего не может сделать и ничего не вернуть. Пример:
time.sleep(1)
.Есть несколько случаев, когда имя может дать сильный намек на тип функции, но во многих случаях вы не сможете узнать тип только по ее имени.
источник
getSomething
иsetSomething
являются обычными именами, используемыми вместо свойств.