2017-09-30 4 views
0

Supposons que nous avons une classefaçon Pythonic de gérer les appels longue méthode des classes à l'intérieur

class foo(): 
    def __init__(self): 
     self.data = 10 
    ... 

    def method(self): 
     ... 
     self.free_indices.append(self.l[self.start_p]) 
     var1 = self.l[self.search(var2[num])].pointer 
     ... 

On voit clairement que la méthode et l'attribut appels au sein de la classe est trop long et donc la lisibilité des codes diminue. Pour résoudre ce problème on pourrait créer une paire de méthodes

def get_some_att(self, var2, num): 
     return self.l[self.search(var2[num])].pointer 

    def append_index(self): 
     self.free_indices.append(self.l[self.start_p]) 

qui, au premier coup d'œil semble raisonnable, mais supposons que vous avez une douzaine de ces appels différents, alors qu'allez-vous faire? Voulez-vous créer une douzaine de méthodes get_some_att et donc diminuer la vitesse d'exécution globale d'une quantité spectaculaire. Ou allez-vous heureusement oublier tous les appels pour augmenter la vitesse, mais faire des compromis sur la lisibilité. Alors, quelle est la vraie façon de gérer ce genre de dilemmes avec pythonic ™?

+1

Comment est 'self.get_some_att (self.data) 'plus lisible que' self.some_att [self.data] '? – Barmar

+0

Vous avez raison. Ce fut un mauvais exemple, je vais changer pour un plus pertinent. –

+0

Peut-être que vous cherchez des getters et setters de propriété? https://stackoverflow.com/questions/2627002/whats-the-pythonic-way-to-use-getters-and-setters – Barmar

Répondre

0

Selon PEP8, la méthode préférée pour rompre les longues lignes sans utiliser \ est d'envelopper vos instructions entre parenthèses. Par exemple:

class foo(): 
def __init__(self): 
    self.data = 10 

def method(self): 
    self.free_indices.append(self.l[self.start_p]) 
    var1 = (
     self.l[self.search(var2[num])] 
      .var3 # you can chain method/attribute calls vertically 
    ) 
+0

Ainsi, vous suggérez que je ne devrais pas m'embêter à créer des méthodes ou des procédures 'get '? Même pour les plus fréquents? –

+0

Je suggère d'essayer de simplifier vos structures de données et de rendre les noms d'attributs aussi clairs que possible, et de préférence se référer explicitement aux attributs. Définir un groupe de getters et setters est parfois pratique, mais vous ne devriez en avoir qu'une poignée. Si vous devez accéder dynamiquement à l'attribut d'un objet, vous pouvez utiliser 'getattr'. – JAponte

0

Que ce soit ayant un seul method pour effectuer des tâches multiples ou les briser dans un contrat distinct, get_some_att et append_index, est tout au sujet de la façon dont vous concevez la classe/module.

Ce n'est pas seulement une question de lisibilité mais aussi de maintenance. Avoir une méthode séparée pour une tâche spécifique ne vous aide pas seulement à y accéder lorsque vous en avez besoin à l'avenir, mais vous pouvez également améliorer le code en cas d'exceptions ou d'améliorations requises. Par conséquent, avoir des méthodes séparées (pour chaque travail individuel) vous aidera éventuellement à retrouver les exceptions et à vous donner la liberté de modifier la seule section. Donc, je dirais à long terme de (grands/très grands) projets (ce qui sera en fait avec le temps), son absolue nécessaire d'avoir des méthodes séparées pour chaque travail individuel pour une meilleure lisibilité, maintenabilité et facile à déboguer et réparer.

Oui Je suis d'accord que le temps d'exécution vous coûte probablement un peu plus mais vaut la peine de le faire car il vous fera gagner beaucoup de temps de développement, et vous aidera à tracer facilement l'erreur en production. Maintenant, en arrivant à la façon pythonique de faire le code, je vais vous suggérer d'utiliser un outil pylint ou flake8 pour vérifier la complexité du fichier.

Néanmoins, ayant une des méthodes distinctes pour toutes les tâches individuelles vaut la peine quand vous savez qu'il pourrait avoir besoin pour un autre endroit aussi bien dans un proche avenir (pratique SEC)