我想从
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的自动重构功能可以做到这一点吗?
3条答案
按热度按时间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。结果如下所示:
第二步:将方法转换为自由函数
现在,让我们将新方法从类中拉出来,并将其转换为模块级函数:
1.选择新提取的方法或将光标放在其中的任意位置(签名或正文)
1.按F6
从上下文菜单中选择【重构】>【移动…】
1.在出现的“Make Method Top-Level”对话框窗口中,保持“To”输入字段不变(即设置为当前模块的源文件位置),点击【重构】
结果如下所示:
第三步:重命名参数
正如您所看到的,重构正确地将
self
参数替换为两个操作数参数。不幸的是,它使用了相应的“隐藏”示例成员的_...
名称。1.在函数的签名中或函数使用参数的位置选择一个下划线(
_
1.按Shift+F6
从所选内容的上下文菜单中选择重构>重命名...
1.在出现的“重命名”对话框窗口中,下划线已经被选中,因此只需按←或Del,然后按Enter(或单击Refactor按钮)
对其他函数参数重复上述步骤。
(In如果您想选择完全不同的名称,只需将光标放在要更改的参数名称中,而不选择其中的一部分。然后,整个名称将在对话框输入字段中开始选中,并且可以通过键入新内容来覆盖。)
结果如下所示:
第四步(可选):将函数移到源文件的顶部
(or无论你想把它放在哪里)
正如您所看到的,PyCharm将新的顶级函数放置在类之后。我想在它之前拥有它。在GNOME上的PyCharm 2016.3.2中,使用John's answer中推荐的Shift+Alt+↑移动它对我不起作用,所以我只是选择了该函数,并使用Crtl+x剪切它,然后使用Crtl+ v将其粘贴到我想要的位置。
tvz2xvvm2#
没有一个直接的方法来做你想做的事情,但你可以围绕它工作:
1.选择
self._a + self._b
语句,然后右键单击>重构>提取>方法,或Ctrl + Alt + M1.在弹出窗口中,为函数选择一个名称(例如
add
)> OK。这将生成一个名为given的类函数。该过程还将重构用法以匹配您的案例。1.选择新生成的函数及其内容,按住Shift + Alt,按下Up或Down按钮,将其移动到代码中您希望的位置。此外,当您选择并放置在它的最后一个地方,按Shift + Tab键来修复您的识别。
1.更改生成的函数参数以匹配您的情况:
擦除
self
,添加a
、b
等。还要擦除函数内部的
self.
。您可以通过查找和替换来执行此操作:Ctrl + R >在第一个搜索栏中键入
self.
>保留第二个搜索栏为空,并从文件的开头开始,单击“替换”按钮,直到一切似乎正确。1.在
evaluate
函数中,删除将在生成的函数名称之前生成的self.
。同时将正确的参数传递给函数(例如return add(self.a, self.b)
)你就完成了,这是一个有点工作,它不是那么多的自动化,但它会保存你一些打字时间!
s4n0splo3#
截至2023年,仍然没有直接的解决方案,但这里有一个简短的解决方案:
1.使用Ctrl+Alt+M提取方法
1.转到新方法的声明(Ctrl+单击其名称)
1.按Alt+Enter并选择
Make function from method
(确保光标位于方法名称上)