2011-11-21 11 views
5

¿Cuáles serían las convenciones de nomenclatura en Python para funciones que pueden devolver un objeto modificado o que simplemente modifica la instancia?Convenciones de nomenclatura de Python para funciones que modifican el objeto o devuelven una copia modificada

Supongamos que desea implementar ambas, ¿cómo debe nombrar las funciones?

Ejemplo: Supongamos que desea una función crop() para un objeto Imagen. I Ruby fue simple porque debe usar crop() si devuelve una copia y crop!() si modifica la instancia original.

Respuesta

5

No estoy seguro de si hay alguna directriz precisa en algún PEP, pero mirando cómo funcionan ciertas funciones/métodos en Python Core yo personalmente uso conjugación de verbos. Por ejemplo, inspirado por:

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

Me gustaría nombrar sus funciones crop() [modificar objeto en su lugar] y cropped() [devolver una copia modificada].

EDIT: No sé ruby, pero en python la distinción entre los dos es puramente convencional (el comportamiento de la función/método es independiente de cómo lo llame).

HTH!

1

No existen convenciones de "ancho de Python" para este AFAIK. Sin embargo, un proyecto en el que trabajo tiene una convención que puede serle útil: si una función puede modificar su argumento in situ, tiene un kwarg copy que determina si opera en una copia de su entrada, y está predeterminado en True.

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

En la biblioteca estándar, existen métodos como list.sort() y list.reverse() que modifican la list en su lugar, y funciones como sorted() y reversed() que devuelven algo nuevo (reversed() un iterador en lugar de una nueva lista). Pero si tiene más sentido tener un método de instancia que una función, no lo haría solo para mantener esta convención.

En NumPy, muchas funciones y métodos tienen un argumento de palabra clave out que le permite especificar que la salida debe ir a una matriz existente en lugar de crear una nueva. Incluso puede hacer que la matriz out sea una de las matrices de entrada.

0

Si quiero algo que sea modificable en su lugar, me gustaría escribir un método:

smth.crop() 

Y si me gustaría para que devuelva un objeto modificado, entonces me gustaría utilizar una función:

crop(smth) 

De esta forma puede mantener las funciones en estilo funcional (sin efectos secundarios) y métodos en estilo OOP (con efectos secundarios).

Sin embargo, también deseo que Python permitiera los caracteres ! y ? en nombres de funciones como Ruby y Lisp.

+0

En cuanto a '?', Existe una convención común para los predicados: use 'is' al comienzo del nombre de la función. –

+1

También 'has_' a veces. – Halst

Cuestiones relacionadas