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

vqlkdk9b  于 2023-05-29  发布在  PyCharm
关注(0)|答案(3)|浏览(250)

我想从

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的自动重构功能可以做到这一点吗?

1yjd4xko

1yjd4xko1#

我不知道这是否可以通过一次重构来完成,但它可以在3-4个步骤中几乎完全自动化地完成:
1.使用Ctrl+Alt+M提取方法
1.使用F6将其转换为自由函数(PyCharm术语中的“将方法移动到顶层”)
1.使用Shift+F6重命名参数
1.(可选:)将函数移动到源文件的顶部(手动)
具体步骤:

第一步:提取方法

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

  • 或者 *

从所选内容的上下文菜单中选择重构>提取>方法...
1.在出现的对话框窗口中,输入函数的名称(在我的示例中为add),然后单击OK
结果如下所示:

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.选择新提取的方法或将光标放在其中的任意位置(签名或正文)
1.按F6

  • 或者 *

从上下文菜单中选择【重构】>【移动…】
1.在出现的“Make Method Top-Level”对话框窗口中,保持“To”输入字段不变(即设置为当前模块的源文件位置),点击【重构】
结果如下所示:

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.在函数的签名中或函数使用参数的位置选择一个下划线(_
1.按Shift+F6

  • 或者 *

从所选内容的上下文菜单中选择重构>重命名...
1.在出现的“重命名”对话框窗口中,下划线已经被选中,因此只需按←或Del,然后按Enter(或单击Refactor按钮)
对其他函数参数重复上述步骤。
(In如果您想选择完全不同的名称,只需将光标放在要更改的参数名称中,而不选择其中的一部分。然后,整个名称将在对话框输入字段中开始选中,并且可以通过键入新内容来覆盖。)
结果如下所示:

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

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

(or无论你想把它放在哪里)
正如您所看到的,PyCharm将新的顶级函数放置在类之后。我想在它之前拥有它。在GNOME上的PyCharm 2016.3.2中,使用John's answer中推荐的Shift+Alt+↑移动它对我不起作用,所以我只是选择了该函数,并使用Crtl+x剪切它,然后使用Crtl+ v将其粘贴到我想要的位置。

tvz2xvvm

tvz2xvvm2#

没有一个直接的方法来做你想做的事情,但你可以围绕它工作:
1.选择self._a + self._b语句,然后右键单击>重构>提取>方法,或Ctrl + Alt + M
1.在弹出窗口中,为函数选择一个名称(例如add)> OK。这将生成一个名为given的类函数。该过程还将重构用法以匹配您的案例。
1.选择新生成的函数及其内容,按住Shift + Alt,按下Up或Down按钮,将其移动到代码中您希望的位置。此外,当您选择并放置在它的最后一个地方,按Shift + Tab键来修复您的识别。
1.更改生成的函数参数以匹配您的情况:
擦除self,添加ab等。
还要擦除函数内部的self.。您可以通过查找和替换来执行此操作:
Ctrl + R >在第一个搜索栏中键入self.>保留第二个搜索栏为空,并从文件的开头开始,单击“替换”按钮,直到一切似乎正确。
1.在evaluate函数中,删除将在生成的函数名称之前生成的self.。同时将正确的参数传递给函数(例如return add(self.a, self.b)
你就完成了,这是一个有点工作,它不是那么多的自动化,但它会保存你一些打字时间!

  • 这是在PyCharm 2017.1专业版中测试的 *
s4n0splo

s4n0splo3#

截至2023年,仍然没有直接的解决方案,但这里有一个简短的解决方案:
1.使用Ctrl+Alt+M提取方法
1.转到新方法的声明(Ctrl+单击其名称)
1.按Alt+Enter并选择Make function from method(确保光标位于方法名称上)

相关问题