9

La plupart des fonctions sont faciles à nommer. Généralement, un nom de fonction est basé sur ce qu'il fait ou sur le type de résultat qu'il produit.Noms des fonctions du générateur Python - un préfixe est-il utile?

Dans le cas d'une fonction de générateur, cependant, le résultat pourrait être itérable sur un autre type.

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

Le nom sometype se sent trompeur, car la fonction ne retourne pas un objet du type nommé. C'est vraiment un itératif sur sometype. Un nom comme iter_sometype ou gen_sometype ressemble un peu trop à Hungarian Notation. Cependant, il semble également clarifier l'intention de la fonction.

En outre, il existe un certain nombre de cas plus spécialisés, où un préfixe peut être utile. Voici des exemples typiques, dont certains sont disponibles dans itertools. Cependant, nous avons souvent besoin d'écrire une version qui a une certaine complexité algorithmique qui fait similaire à itertools, mais pas un ajustement parfait.

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 

Est-ce que le iter_, map_, reduce_, préfixe filter_ aider à clarifier le nom d'une fonction de générateur? Ou est-ce juste un fouillis visuel?

Si un préfixe est utile, quelles suggestions de préfixe avez-vous?

Alternativement, si un suffixe est utile, quelles suggestions de suffixe avez-vous?

+0

Je pense que vous êtes plutôt généralisé ... je veux dire, la plupart écriraient simplement vos 2e et 3e fonctions directement comme expressions génératrices ala '(some_mapping (x) pour x dans iterable)'. Le premier ne "réduit" vraiment rien, c'est plus comme un mapping car il y a un nouveau "sometype" pour chaque "x". –

+1

@ THC4k: S'il vous plaît imaginez qu'ils sont plus complexes.Trop complexe pour s'intégrer facilement dans 'itertools'. Pas si complexe qu'ils violent les principes de base de la programmation fonctionnelle. Par exemple, ils pourraient impliquer beaucoup de travail d'installation préliminaire comme une optimisation. –

Répondre

6

Python dicts ont iter* méthodes. Et les arbres lxml ont aussi une méthode iter. Lecture

for node in doc.iter(): 

semble familier, si suivant ce modèle, je considère nommer le générateur de sometypes sometypes_iter pour que je puisse écrire analgously,

for item in sometypes_iter(): 

Python fournit une fonction sorted. Après ce modèle, je pourrais faire le verbe-fonctions passé:

sometypes_reduced 
sometypes_mapped 
sometypes_filtered 

Si vous avez assez de ces fonctions, il peut être judicieux de faire une classe SomeTypes si les noms de méthode pourraient être raccourcies à reduce, map et filter. Si les fonctions peuvent être généralisées pour accepter ou renvoyer des types autres que sometype, il est alors logique de supprimer sometype du nom de la fonction et de choisir un nom qui met l'accent sur ce qu'il fait plutôt que sur les types.