9

La mayoría de las funciones son fáciles de nombrar. En general, el nombre de una función se basa en lo que hace o en el tipo de resultado que produce.Python Generator Function Names - ¿es útil un prefijo?

En el caso de una función de generador, sin embargo, el resultado podría ser iterable sobre algún otro tipo.

def sometype(iterable): 
    for x in iterable: 
     yield some_transformation(x) 

El nombre sometype siente engañosa, ya que la función no devuelve un objeto del tipo llamado. Es realmente iterable sobre sometype.

Un nombre como iter_sometype o gen_sometype se parece demasiado a Hungarian Notation. Sin embargo, también parece aclarar el propósito de la función.

Adelante, hay una serie de casos más especializados, donde un prefijo podría ser útil. Estos son ejemplos típicos, algunos de los cuales están disponibles en itertools. Sin embargo, a menudo tenemos que escribir una versión que tenga cierta complejidad algorítmica que lo haga similar a itertools, pero no un ajuste perfecto.

def reduce_sometype(iterable): 
    summary = sometype() 
    for x in iterable: 
     if some_rule(x): 
      yield summary 
      summary= sometype() 
     summary.update(x) 

def map_sometype(iterable): 
    for x in iterable: 
     yield some_complex_mapping(x) 

def filter_sometype(iterable): 
    for x in iterable: 
     if some_complex_rule(x): 
       yield x 

¿El iter_, map_, reduce_, filter_ prefijo ayudar a aclarar el nombre de una función de generador? ¿O es solo un desorden visual?

Si un prefijo es útil, ¿qué sugerencias de prefijo tiene?

Alternativamente, si un sufijo es útil, ¿qué sugerencias de sufijo tiene?

+0

Creo que está un poco sobre generalizado ... quiero decir, la mayoría simplemente escribiría sus funciones segunda y tercera directamente como expresiones de generador ala '(some_mapping (x) para x en iterable)'. El primero no "reduce" nada, es más como un mapeo, ya que hay un nuevo "tipo" para cada "x". –

+1

@ THC4k: imagine que son más complejos.Demasiado complejo para caber fácilmente dentro de 'itertools'. No tan complejos que violan principios básicos de programación funcional. Por ejemplo, pueden implicar una gran cantidad de trabajo de configuración preliminar como una optimización. –

Respuesta

6

Python dicts tienen iter* métodos. Y los árboles lxml también tienen un método iter. lectura

for node in doc.iter(): 

resulta familiar, por lo siguiendo ese patrón, me gustaría considerar nombrar el generador de sometypes sometypes_iter por lo que podría escribir analgously,

for item in sometypes_iter(): 

Python proporciona una función sorted. Siguiendo ese patrón, que podría hacer que las verbales funciones de tiempo pasado:

sometypes_reduced 
sometypes_mapped 
sometypes_filtered 

Si usted tiene suficiente de estas funciones, podría tener sentido para hacer una clase SomeTypes por lo que los nombres de los métodos podría reducirse a reduce, map y filter.

Si las funciones se pueden generalizar para aceptar o devolver tipos que no sean sometype, entonces por supuesto tendría sentido eliminar sometype del nombre de la función, y en su lugar elija un nombre que enfatice lo que hace en lugar de los tipos.