使用 PyCharm 进行代码生成与重构
在工作学习中,我们可能会遇到下面的场景,要编写一些想似度很高的代码,或者需要移动某个函数到其它文件中或者类中,并且希望引用该函数的代码都能自动更新,如果要解决上述问题,就涉及到代码生成与重构功能。为了提高工作效率,PyCharm 提供了多种生成通用代码结构和重复元素的方法,也提供了各种各样的代码重构,可自动跟踪和更正受影响的代码引用,本节将介绍与代码生成与重构相关常用功能。
1. 代码生成
1.1 使用活动模板(Live Template) 生成定制代码
PyCharm 为许多常见代码构造提供了大量预定义的 Live Template。我们也可定义自定义模板,以适应特定的工作流。
step1:光标停留在要展开模板的位置。
step2:输入模板缩写,或者打开主菜单 code -> Insert Live Template...
,打开建议列表并选择需要的模板。如图所示:自定义模板与 IDE 预定义的模板都会显示在列表里。
1.2 根据用途生成 Symbols
Python 有不同类型对象, 像类、方法或者变量。这些对象都是用字符串符号代表其名字,根据用途生成Symbols 就是根据名字所代表的对象类型,生成与之匹配的对象。
step1:引用不存在方法的名称。IDE高亮显示引用。按⌥⏎ (Alt + Enter),然后从建议列表中选择相应的选项。
Tips:一个 Symbol 可能是一个变量名或者一个方法名。
step2:选中第一项,如图所示, Write 方法自动添加到 People 类 。
1.3 重写超类的方法
step1:依然是上面的例子,Student 是 People 子类,现在想重写父类的 speak 方法。主菜单:Code -> Override methods
或者右键单击 类 Student 代码块中的任意位置,点击 Generate
, 然后选择 Override methods
,在弹出列表中选择要重写的方法。
step2:单击ok, 生成新的代码。
1.4 实现接口或抽象类的方法
step1:Skills是个抽象类,定义了 Write 与 Read 两个方法, Junior 是 Skills 子类,现在需要实现抽象方法。主菜单:Code -> Implement Methods
或者右键单击 类 Junior 代码块中的任意位置,点击 Generate
, 然后选择 Implement Methods
,在弹出列表中选择要实现的方法。
Tips: 如果有多个方法需要实现,可以一次同时选择多个方法(按住Shift)
step2:单击ok, 生成新的代码。
1.5 自动生成 Surround code 代码片段
所谓 Surround code 就是像if…else , do…while and for loops 以及try…catch…finally这样的语句。PyCharm 提供了基于这种代码片段的标准模板。
step1: 光标停留在某条语句末尾。
step2: 主菜单 Code -> Surround With
或者 ⌥ ⌘T ( Alt + Ctrl + T)
step3: 从列表中选择需要的语句。
step4:比如选择 try / except, 相应的语句自动生成。
2. 代码重构
代码重构是在不改变代码外在行为的前提下对代码做出修改,以改进代码的内部结构的过程。 PyCharm提供了各式各样的重构,下面将介绍一些常用的重构方法。
2.1 代码重构基本步骤
step1:选择要重构的代码片段。
step2:在主菜单 Refactor -> Refactor This ...
或所选内容的上下文菜单中(击右键),选择Refactor
。
step3:在打开对话框会列出所有重构项目,指定重构选项(比如:Change Signature…)。在弹出窗口执行更改,若要立即应用更改,请单击"Refactor"。
Tips: 对于某些重构,可以选择在实际执行重构之前预览更改。在这种情况下,"预览"按钮在相应的对话框中可用。
step4:点击 “Refactor”, 返回到编辑器,代码已经被自动更新了。
2.2 更改签名
更改签名重构包括以下几种情况:
- 更改函数名称;
- 添加、删除和重新排序参数 ( 上面的例子就是这种情况);
- 将默认值分配给参数。
更改函数签名时,PyCharm 会搜索函数的所有用法,通常调用函数的签名会相应地更改,同时,这些更改还取决于为新参数设置的默认值。
2.3 转换为包和模块
PyCharm 允许 Python 模块转换为 Python 包,反之也可以。
step1:选择一个 .py 文件, 比如 “test.py
”;
step2:主菜单 Refactor -> Convert to Python Package
或者 选择文件击右键,如下图所示:
step3:查看项目, 创建名为转换模块的包 (test), __init__.py 文件包含来自 .py 文件的所有代码。
Tips:创建包后,通常需要修改 init.py 文件,添加包的一些初始化代码。也可以向其添加更多新模块。
2.4 移动和复制重构
移动重构可以项目中移动类、函数、模块、文件和目录。PyCharm 会跟踪这些改变,并自动更正源代码中对移动对象的所有引用。
将文件或目录移动到其他目录
- 在"Project"工具窗口中选择文件或目录;
- 从主菜单或击右键在上下文菜单中选择
Refactor -> Move File...
; - 在"To directory"字段中,指定要将所选文件或文件夹移动到的文件夹。从列表中选择现有文件夹,或键入要创建的父文件夹的完整路径。
Tips:在选定文件后, 也可以在"Project"工具窗口中,按住 Ctrl,然后将选择的文件拖动到目标位置。
移动顶层符号(symbols)
所谓顶层符号是顶格定义对象,像类、函数或变量,以及main 函数定义的变量。这些对象都可以移到
其它文件里。
- 在编辑器打开文件,将光标停留在某个顶层函数声明处;
- 从主菜单或击右键在上下文菜单中选择
Refactor -> Move...
; - 在弹出对话框中,选择要移动的成员,并指定目标文件;
- 点击 Refactor, 函数移动到新文件。
移动函数/方法到顶层
- 在编辑器打开文件,将光标停留在类方法声明处。
- 从主菜单或击右键在上下文菜单中选择
Refactor -> Move...
。 - 在弹出对话框中,指定目标文件。
- 查看移动后结果。
复制重构
复制重构可以在不同的或同一目录中创建文件或目录的副本。
- 在 Project 窗口中选择文件;
- 从主菜单或右键在上下文菜单 “Refactor -> Copy File…;
- 在打开的 “Copy” 对话框中,指定要创建的副本的名称和位置,然后单击"Refactor",新的文件就会被创建在指定目录下。
Tips:在选择文件后,上下文菜单里直接选择 copy->copy
, 然后右键点击目标路径,在上下文菜单选择 Paste
也会弹出上面的窗口。
2.5 提取重构
提取重构使源代码更易于阅读和维护。PyCharm 也提供了不同的方法,包括常量、方法及超类的提取等等。下面以提取方法为例介绍提取重构的过程:
- 在编辑器中,选择要转换为方法或函数的代码块;
- 从主菜单或上下文菜单中选择 Refactor -> Extract Method…
Tips: 形成方法的代码片段不一定必须是一组语句。它也可以是代码中某处使用的表达式。
- 在打开的"Extract Method"对话框中,指定新函数的名称。
- 查看结果,所选代码片段将替换为函数调用。
2.6 内联重构
内联重构相当于提取重构的逆过程。比如上面的方法,内联方法将方法的正文放入其调用它demo2方法的主体中。
- 在编辑器中,选择要转换的方法;
- 从主菜单或上下文菜单中选择
Refactor -> inline...
; - 在打开的对话框 “inline method 具体的方法名“ , PyCharm 会提示选择是在重构后删除方法声明还是保持其完好无损。根据选择,重构结果会有所不同。
代码是需要抽取重构还是内联重构,要具体问题具体分析,比如一段代码出现在代码多处位置,就应该有抽取重构构造新的方法。上面的方法如果被多处调用,做内联重构也是不合适的。
除此以外,一个变量只是被简单的赋值,然后又被其它表达式使用,那这个变量可能是冗余的,需要内联重构去掉冗余变量。总之,我们要通过不断的实践学习才能在重构过程中做出正确的判断。
2.7 重命名重构
使用重命名重构更改symbols、文件的名称以及在整个代码中对它们的所有引用。
- 在"Project"工具窗口中选择要重命名的文件, 或者在编辑器中选择一个要重命名的元素(类名、方法名);
- 从主菜单或击右键在上下文菜单中选择
Refactor -> Rename...
。
在大项目内,通常模块或者公共方法接口的名字都在编码前事先定义好了,像上面重命名重构是极少做的,毕竟涉及很多改动,风险比较大。如果由于特殊情况需要做,也要在重构前,仔细阅读所有引用代码,评估其风险。
3. 小结
本节主要讲解了代码生成与代码重构的相关功能。代码生成更多功能的是帮助开发人员提高开发效率,在大多数情况下,还是需要在自动生成代码基础上修改完善的。而代码重构更多的是保证代码在完成基本功能前提下,更好的使代码具有更好的适应性与可读性,难点是分析哪些代码需要重构,这依赖于编写大量代码后的经验积累,所以,多写代码做更多项目才能逐渐掌握相关的知识。