PyCharm可以帮助我从方法中提取自由函数吗?

时间:2017-04-18 11:47:53

标签: python pycharm automated-refactoring

我想来自

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)

即从方法evaluate中提取表达式self._a + self._b作为“自由函数”(不是方法的函数)。这可能与PyCharm的自动重构有关吗?

2 个答案:

答案 0 :(得分:1)

没有直接的方法来做你想做的事,但你可以解决它:

  1. 选择self._a + self._b语句,右键单击>重构>提取物>方法,或 Ctrl + Alt + M
  2. 在弹出窗口中,选择您的功能名称(例如add)>好。这将生成一个名为given的类函数。该过程还将重构用法以匹配您的情况。
  3. 选择新生成的函数及其内容,然后按 Shift + Alt Up Down 按钮将其移动到您希望它在您的代码中的位置。此外,当您选择并放置在最终位置时,按 Shift + Tab 来修复您的身份。
  4. 更改生成的函数参数以匹配您的情况:
    删除self,添加ab等。
    同时删除函数内的所有地方self.。您可以通过查找和替换来执行此操作:
    Ctrl + R >在第一个搜索栏中输入self.>将第二个搜索栏留空并从文件开头开始,单击替换按钮,直到所有内容都正确无误。
  5. evaluate功能中删除将在生成的函数名称之前生成的self.。同时将正确的参数传递给函数(例如return add(self.a, self.b)
  6. 你已经完成了,这是一项工作,并没有那么多的自动化,但它会节省你一些打字时间!

    这是在PyCharm 2017.1专业版

    中测试的

答案 1 :(得分:0)

我不知道这是否可以通过单次重构来完成,但它可以通过3-4步完成几乎完全自动化:

  1. 使用 Ctrl + Alt + M
  2. 提取方法
  3. 使用 F6
  4. 将其转换为自由函数(使用PyCharm术语“将方法移至顶级”)
  5. 使用 Shift + F6重命名参数
  6. (可选:)将函数移动到源文件的顶部(手动)
  7. 详细步骤:

    第一步:提取方法

    1. 选择要提取的表达式或语句(此处为self._a + self._b
    2. Ctrl + Alt + M

      从选择的上下文菜单中选择重构> 提取>的方法...

    3. 在显示的对话框窗口中,输入您的功能名称(在我的示例中为add),然后点击确定
    4. 结果如下:

      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
      

      第二步:将方法转换为自由函数

      现在,让我们将新方法从类中拉出来并将其转换为模块级函数:

      1. 选择新提取的方法或将光标放在其中的任何位置(签名或正文)
      2. F6

        从上下文菜单中选择重构>的移动...

      3. 在出现的“Make Method Top-Level”对话框窗口中,保持“To”输入字段不变(即设置为当前模块的源文件位置),然后单击 Refactor
      4. 结果如下:

        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
        

        第三步:重命名参数

        正如您所看到的,重构已经正确地用操作数的两个参数替换了self参数。不幸的是,它使用了相应“隐藏”实例成员的_...名称。

        1. 在函数签名中选择一个下划线(_)或函数使用参数的位置
        2. Shift + F6

          从选择的上下文菜单中选择重构>的重命名...

        3. 在出现的“重命名”对话框窗口中,已经选择了下划线,因此只需按 Del ,然后按 Enter (或单击重构按钮)
        4. 重复其他函数参数。

          (在您想要选择完全不同的名称的情况下,只需将光标放入参数名称即可更改而不选择其中的一部分。然后整个名称将在对话框输入字段中开始选择,并且可以被覆盖输入新内容。)

          结果如下:

          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
          

          第四步(可选):将函数移动到源文件的顶部

          (或者你想放置的地方)

          正如您所看到的,PyCharm在课后放置了新的顶级功能。我想在它之前拥有它。按照John's answer中的建议移动 Shift + Alt + 在GNOME的PyCharm 2016.3.2中对我不起作用,所以我刚刚选择了这个函数,并用 Crtl + x 剪切它并用 Crtl + v粘贴到我想要的地方