【问题标题】:Moving function/method to class将函数/方法移动到类
【发布时间】:2017-10-17 06:53:06
【问题描述】:

使用 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

我不介意选择没有初始化参数的课程。

【问题讨论】:

  • 你为什么要上课?在这里好像没什么用。
  • 你想在类或方法的调用上传递参数吗?

标签: python refactoring pycharm automated-refactoring


【解决方案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()

现在您可以在 PyCharm 中选择Edit -> Find -> Replace in Path,检查正则表达式选项,将第一个正则表达式粘贴到第一个字段,第二个粘贴到下一个字段。我已经用一个文件在本地进行了测试,效果很好。这里是regex101 example,所以你可以玩它并测试它。

如果您对该方法有很多用法,这将很有用,否则手动执行此操作可能会更快。

【讨论】:

  • grundic,你是怎么想出这个正则表达式的?你是专门写来回答这个问题的吗?你写它是为了你自己的目的吗?你在什么地方找到的吗?是否还有其他像这样的正则表达式可用于重构?在哪里可以找到它们?
  • 我想我只是为这个问题写了这个正则表达式。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2020-05-04
相关资源
最近更新 更多