2017-05-17 5 views
1

En utilisant pycharm, je souhaite refactoriser les méthodes dans une classe. (Staticmethod ferait) actuel:Déplacement de la fonction/méthode vers la classe

import math 

class Solver(object): 
    def __init__(self, a, b, c): 
     self.a = a 
     self.b = b 
     self.c = c 


def demo(b, a, c): 
    d = b ** 2 - 4 * a * c 
    if d >= 0: 
     disc = math.sqrt(d) 
     root1 = (- b + disc)/(2 * a) 
     root2 = (- b - disc)/(2 * a) 
     print(root1, root2) 
     return root1, root2 
    else: 
     raise Exception 


s = Solver(2, 123, 0.025) 
demo(s.b, s.a, s.c) 

désiré:

import math 

class Solver(object): 
    def __init__(self,a,b,c): 
      self.a = a 
      self.b = b 
      self.c = c 

    def demo(self, a, b, c): 
      d = self.b ** 2 - 4 * self.a * self.c 
      if d >= 0: 
       disc = math.sqrt(d) 
       root1 = (- self.b + disc)/(2 * self.a) 
       root2 = (- self.b - disc)/(2 * self.a) 
       print(root1, root2) 
       return root1, root2 
      else: 
       raise Exception 

Solver(2, 123, 0.025).demo() 

Je suis fondamentalement en train d'obtenir la fonctionnalité en face: fonction "Déplacement/méthode au plus haut niveau"

comme décrit ici: https://www.jetbrains.com/help/pycharm/2017.1/move-refactorings.html

Cela ne me dérangerait pas de régler pour une classe sans paramètres init.

+1

Pourquoi voulez-vous un cours? Cela ne semble pas utile ici. – user2357112

+1

Souhaitez-vous transmettre les arguments sur l'appel de la classe ou de la méthode? – Max

Répondre

0

Par défaut, il n'y a pas une telle option: PyCharm est assez bon pour refactoriser les classes et les méthodes, mais ne peut pas faire grand-chose avec des fonctions autonomes. Cependant, il existe une solution à votre problème: regex!

Fondamentalement, ce que vous avez à faire est:

  1. Modifier fonction à la méthode limitée (vous avez déjà fait cela dans votre exemple)
  2. Remplacer toutes les occurrences de l'ancien appel de méthode avec un refactorisé.

Voici le regex qui vous permettra de le faire, par exemple mentionné ci-dessus:

([\w]+)[ \t]+=[ \t](Solver[ \t]*\(([\d.]+)[ \t]*,[ \t]*([\d.]+)[ \t]*,[ \t]*([\d.]+)[ \t]*\))\n\r?demo[ \t]*\(\1\.b[ \t]*,[ \t]*\1\.a[ \t]*,[ \t]*\1\.c[ \t]*\) 

Et voici le remplacement:

$2\.demo() 

Vous pouvez maintenant sélectionner Edit -> Find -> Replace in Path dans PyCharm, consultez regex option, coller la première regex au premier champ et la seconde au suivant. J'ai testé cela localement avec un fichier et cela a bien fonctionné. Et voici regex101 example donc vous pouvez jouer avec et le tester.

Cela serait utile si vous avez beaucoup d'utilisations de cette méthode, sinon cela pourrait être plus rapide de le faire manuellement.

+0

J'ai beaucoup d'usages merci pour la réponse –