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:
- extraire une méthode avec Ctrl + Alt +M
- transformer en une fonction libre ("méthode de déplacement vers le haut au niveau" dans le jargon PyCharm) avec F6
- arguments de renommage avec Maj + F6
- (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
- Sélectionnez l'expression ou de la déclaration (s) à extraire (ici
self._a + self._b
)
Appuyez sur Ctrl + Alt + M
ou
dans le menu contextuel de la sélection, choisissez Refactor>Extrait>Méthode ...
- 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:
- Sélectionnez la méthode nouvellement extrait ou placez le curseur partout en elle (la signature ou le corps)
Appuyez sur F6
ou
dans le menu contextuel, choisissez Refactor>Déplacer ...
- "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.
- Sélectionnez un underscore (
_
) dans la signature de la fonction ou lorsque la fonction utilise les arguments
Appuyez sur Maj + F6
ou
dans le menu contextuel de la sélection, choisissez Refactor>Renommer ...
- 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.