Соглашения об именах Python для функций, которые изменяют объект или возвращают измененную копию - PullRequest
6 голосов
/ 21 ноября 2011

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

Давайте предположим, что вы хотите реализовать и то, и другое, как называть функции?

Пример: предположим, что вы хотите функцию crop() для объекта Image. В Ruby это было просто, потому что вы должны использовать crop(), если вы возвращаете копию, и crop!(), если вы изменяете исходный экземпляр.

Ответы [ 4 ]

5 голосов
/ 21 ноября 2011

Не уверен, есть ли в каком-то PEP точное руководство, но, глядя на то, как определенные функции / методы работают в ядре Python, я лично использую спряжение глагола . Например, вдохновленный:

>>> l = list('hello world')
>>> l
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> sorted(l)
[' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']
>>> l
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
>>> l.sort()
>>> l
[' ', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']

Я бы назвал ваши функции crop() [изменить объект на месте] и cropped() [вернуть измененную копию].

РЕДАКТИРОВАТЬ: Я не знаю ruby, но в python различие между ними является чисто условным (поведение функции / метода не зависит от того, как вы его называете).

НТН!

2 голосов
/ 21 ноября 2011

В стандартной библиотеке есть методы, такие как list.sort() и list.reverse(), которые изменяют list на месте, и функции, такие как sorted() и reversed(), которые возвращают что-то новое (reversed() скорее возвращает итераторчем новый список).Но если имеет смысл иметь метод экземпляра, а не функцию, я бы не стал делать это просто для соблюдения этого соглашения.

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

1 голос
/ 21 ноября 2011

Для этого AFAIK не существует "общепитоновских" соглашений. Однако у проекта, над которым я работаю, есть соглашение, которое может оказаться полезным для вас: если функция может изменить свой аргумент на месте, у нее есть copy kwarg, который определяет, будет ли она работать с копией своего ввода, и по умолчанию имеет значение True.

def crop(x, copy=True):
    if copy:
        x = x.copy()
    _do_inplace_crop(x)
    return x
0 голосов
/ 21 ноября 2011

Если я хочу, чтобы что-то было модифицируемо, я бы написал метод:

smth.crop()

И если бы я хотел, чтобы он возвращал измененный объект, я бы использовал функцию:

crop(smth)

Таким образом вы сохраняете функции в функциональном стиле (без побочных эффектов) и методы в стиле ООП (с побочными эффектами).

Однако я также хотел бы, чтобы Python допускал символы ! и ? в именах функций, таких как Ruby и Lisp.

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