Перемещение функции / метода в класс

Используя pycharm, я хочу реорганизовать методы в класс. (Статический метод сделает) Текущий:

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)

Желаемая:

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()

Я в основном пытаюсь получить противоположную функциональность:"Перемещение функции / метода на верхний уровень"

как описано здесь: https://www.jetbrains.com/help/pycharm/2017.1/move-refactorings.html

Я не возражаю против того, чтобы согласиться на урок без начальных параметров.

1 ответ

По умолчанию такой опции нет: PyCharm достаточно хорош для рефакторинга классов и методов, но мало что может сделать с автономными функциями. Тем не менее, есть решение для вашей проблемы: регулярное выражение!

В основном, что вы должны сделать, это:

  1. Измените функцию на ограниченный метод (вы уже сделали это в своем примере)
  2. Заменить все вхождения старого вызова метода на рефакторированный.

Вот регулярное выражение, которое позволит вам сделать это для вышеупомянутого примера:

([\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]*\)

А вот и замена:

$2\.demo()

Теперь вы можете выбрать Edit -> Find -> Replace in Path в PyCharm отметьте опцию регулярного выражения, вставьте первое регулярное выражение в первое поле и второе в следующее. Я проверил это локально с одним файлом, и он работал хорошо. А вот пример regex101, чтобы вы могли поиграть с ним и протестировать его.

Это было бы полезно, если у вас есть много использования этого метода, в противном случае это может быть быстрее сделать это вручную.

Другие вопросы по тегам