2017-04-18 6 views
3

Je voudrais obtenir deEst-ce que PyCharm peut m'aider à extraire une fonction gratuite d'une méthode?

class Sum: 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    def evaluate(self): 
     return self._a + self._b 

à

def add(a, b): 
    return a + b 


class Sum: 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    def evaluate(self): 
     return add(self._a, self._b) 

dire, extrait de méthode evaluate l'expression self._a + self._b comme une « fonction libre » (une fonction qui n'est pas une méthode). Est-ce possible avec les refactorings automatiques de PyCharm?

Répondre

1

Il n'y a pas un moyen direct de faire ce que vous voulez, mais vous pouvez travailler autour:

  1. Sélectionnez la déclaration self._a + self._b et clic droit> Restructurer> Extrait> Méthode ou Ctrl + Alt + M
  2. Dans la fenêtre contextuelle, choisissez un nom pour votre fonction (par exemple add)> OK. Cela générera une fonction de classe nommée comme donnée. Le processus permettra également de refactoriser l'utilisation pour correspondre à votre cas.
  3. Sélectionnez la fonction nouvellement généré et il le contenu et en maintenant Maj +Alt a frappé le Up ou vers le bas boutons pour le déplacer où vous voulez qu'il soit dans votre code. Aussi comme vous l'avez sélectionné et placé à sa place finale, appuyez sur Shift + Tab pour vous fixer l'identité.
  4. Modifier les arguments de la fonction générés pour correspondre à votre cas:
    Effacer self, ajouter a, b, etc.
    effacer également self. partout dans la fonction. Vous pouvez le faire en recherche et de remplacement:
    Ctrl + R> Type self. dans la première barre de recherche> quitter la seconde barre de recherche vide et à partir du début de votre fichier, cliquez sur le bouton Remplacer, jusqu'à ce que Tout semble correct.
  5. Dans votre fonction evaluate, effacez le self. qui sera généré avant le nom de votre fonction générée. passer également les bons arguments à la fonction (ex. return add(self.a, self.b))

Et vous fait, il est un peu de travail et il est pas beaucoup automatisé, mais il vous permettra d'économiser un peu de temps de frappe!

Ceci est testé dans PyCharm 2017.1 édition pro

0

Je ne sais pas si cela peut se faire avec un seul refactoring, mais il peut être fait presque entièrement automatisé en 3-4 étapes:

  1. extraire une méthode avec Ctrl + Alt +M
  2. transformer en une fonction libre ("méthode de déplacement vers le haut au niveau" dans le jargon PyCharm) avec F6
  3. arguments de renommage avec Maj + F6
  4. (en option :) déplacer la fonctionnalité de la partie supérieure du fichier source (manuellement)

Les étapes en détail:

Première étape: Extrait une méthode

  1. Sélectionnez l'expression ou de la déclaration (s) à extraire (ici self._a + self._b)
  2. Appuyez sur Ctrl + Alt + M

    ou

    dans le menu contextuel de la sélection, choisissez Refactor>Extrait>Méthode ...

  3. Dans la boîte de dialogue qui apparaît, entrez un nom pour votre f untion (dans mon exemple add) et cliquez sur OK.

Le résultat ressemblera à ceci:

class Sum: 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    def evaluate(self): 
     return self.add() 

    def add(self): 
     return self._a + self._b 

Deuxième étape: méthode de se transformer en une fonction libre

Maintenant, nous allons tirer la nouvelle méthode de la classe et le transformer en un module fonction -level:

  1. Sélectionnez la méthode nouvellement extrait ou placez le curseur partout en elle (la signature ou le corps)
  2. Appuyez sur F6

    ou

    dans le menu contextuel, choisissez Refactor>Déplacer ...

  3. "make Méthode de niveau supérieur" fenêtre de dialogue qui apparaît , laissez le champ de saisie "A" tel quel (par ex.réglé sur le fichier source du module actuel emplacement) et cliquez sur Refactor

Le résultat ressemblera à ceci:

class Sum: 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    def evaluate(self): 
     return add(self._a, self._b) 


def add(_a, _b): 
    return _a + _b 

Troisième étape: Comme vous pouvez le voir renommer les arguments

, la refactoring a correctement remplacé l'argument self par deux arguments pour les opérandes. Malheureusement, il a utilisé les noms _... des membres d'instance "cachés" correspondants.

  1. Sélectionnez un underscore (_) dans la signature de la fonction ou lorsque la fonction utilise les arguments
  2. Appuyez sur Maj + F6

    ou

    dans le menu contextuel de la sélection, choisissez Refactor>Renommer ...

  3. Dans la fenêtre de dialogue « Renommer » qui apparaît, le trait de soulignement sera déjà sélectionné, alors appuyez simplement sur ou Del et puis appuyez sur Entrée (ou cliquez sur le Refactor bouton)

Répétez l'opération pour les autres arguments de fonction.

(Dans les scénarios où vous voulez choisir des noms complètement différents, placez simplement le curseur dans le nom de l'argument pour en changer sans en sélectionner une partie.) Le nom entier commence dans le champ de saisie de la boîte de dialogue. . en tapant quelque chose de nouveau)

le résultat ressemblera à ceci:

class Sum: 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    def evaluate(self): 
     return add(self._a, self._b) 


def add(a, b): 
    return a + b 

quatrième étape (en option): Déplacer la fonction vers le haut du fichier source

(ou si jamais vous vouloir le placer)

Comme vous pouvez le voir, PyCharm a placé la nouvelle fonction de premier niveau après la classe. Je voulais l'avoir avant. il se déplacer avec Maj +Alt + comme recommandé dans John's answer n'a pas fonctionné pour moi dans PyCharm   02/03/2016 sur GNOME, donc je viens de choisir la fonction, et le couper avec Crtl +x et collé où je le veux avec Crtl + v.