2011-11-21 19 views
5

Quali sarebbero le convenzioni di denominazione in Python per le funzioni che possono restituire un oggetto modificato o che modifica l'istanza.Convenzioni di denominazione Python per funzioni che modificano l'oggetto o restituiscono una copia modificata

Supponiamo che vogliate implementare entrambi, come dovreste nominare le funzioni?

Esempio: si supponga di volere una funzione per un oggetto Immagine. I Ruby era semplice perché dovresti usare crop() se restituisci una copia e crop!() se modifichi l'istanza originale.

risposta

5

Non sono sicuro che ci sia una linea guida precisa in alcuni PEP, ma osservando come certe funzioni/metodo funzionano nel core Python io personalmente uso la coniugazione dei verbi . Ad esempio, ispirata:

>>> 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'] 

avrei un nome alle funzioni crop() [modificare l'oggetto al suo posto] e cropped() [restituire una copia modificata].

EDIT: Non so rubino, ma in python la distinzione tra i due è puramente convenzionale (comportamento funzione/metodo è indipendente da come si chiamano).

HTH!

1

Non ci sono convenzioni "Python-wide" per questo AFAIK. Tuttavia, un progetto su cui lavoro ha una convenzione che può essere utile per te: se una funzione può modificare il suo argomento sul posto, ha un kwarg copy che determina se funziona su una copia del suo input e il valore predefinito è True.

def crop(x, copy=True): 
    if copy: 
     x = x.copy() 
    _do_inplace_crop(x) 
    return x 
2

nella libreria standard, ci sono metodi come list.sort() e list.reverse() che modificano la list in atto, e funzioni come sorted() e reversed() che restituiscono qualcosa di nuovo (reversed() restituisce un iteratore invece di un nuovo elenco). Ma se ha più senso avere un metodo di istanza che una funzione, non lo farei solo per mantenere questa convenzione.

In NumPy, molte funzioni e metodi hanno un argomento di parola chiave out che consente di specificare che l'output deve passare a un array esistente anziché crearne uno nuovo. È anche possibile rendere l'array out uno degli array di input.

0

Se voglio qualcosa di cui essere modificabile a posto, avrei scritto un metodo:

smth.crop() 

E se mi piacerebbe che per restituire un oggetto modificato, quindi vorrei usare una funzione:

crop(smth) 

In questo modo si mantengono le funzioni in stile funzionale (senza effetti collaterali) e in stile OOP (con effetti collaterali).

Tuttavia, vorrei anche che Python consentisse i caratteri ! e ? in nomi di funzioni come Ruby e Lisp.

+0

Come per '?', Esiste una convenzione comune per i predicati: usare 'is' all'inizio del nome della funzione. –

+1

Anche 'has_' a volte. – Halst

Problemi correlati