在这篇文章中,我将分享我提示GitHub Copilot的最佳实践,以帮助大家尽可能多地获得很好的建议。在高层次上,我的建议是提供背景信息并具有可预测性。
有关更多详细信息,请观看我的YouTube视频或继续阅读。
## 提供上下文
GitHub Copilot经过大量示例的训练,因此对于给定的代码行,它可能对下一行代码有许多可能的预测。我们可以尝试通过代码行周围的上下文来缩小这些可能性。
1. 打开文件:像GitHub Copilot这样的LLM具有有限的“上下文窗口”,因此它不能一次在其窗口中保留整个代码库。但是 GitHub 仍然希望为 Copilot 提供一些上下文,因此如果您的编辑器打开了一些文件,GitHub 可能会将这些文件的内容发送给 Copilot。我建议保持打开与你正在编写的代码最相关的文件:如果你正在编写测试,测试文件,如果你正在处理数据,一个示例数据文件,程序的帮助程序函数等。
正如我在 10:02 的视频中所示,有时有几个与上下文相关的文件:一个演示新文件的格式(例如,新 views.py 具有与现有 views.py 类似的格式),另一个为新文件提供数据(例如,新 views.py 使用来自 models.py 的类)。
2. 注释:您可以在多个级别编写注释:描述文件用途及其与项目其余部分的关系的高级文件注释、函数级注释、类级注释和行注释。最有用的注释是那些清除代码中可能不明确的方面的注释。例如,如果你正在编写一个在 Python 中处理列表的函数,你的函数级注释可以阐明它是返回一个全新的列表还是改变现有列表。这种区别从根本上改变了实现。
```
def capitalize_titles(book_titles): “”“返回一个新的book_titles列表,每个标题都大写”“”
```
3. 导入 :许多语言要求您在文件顶部明确重要的标准库或第三方模块。这些信息对于Copilot决定如何编写所需的代码非常有帮助。例如,如果您使用 Python 抓取网页,则导入 `网址lib3 `和 `美丽汤 `在顶部将立即指导Copilot编写最合适的代码。
4. 名称:我一直是描述性名称的粉丝,因为我在一个Java家庭长大,但现在我有额外的动力使用相当描述性的名字:Copilot的更多上下文。例如,如果您的代码解析 JSON 文件并存储结果,则可以使用变量名称,例如 `数据 `.但是,如果您知道结果实际上是一个列表,并且每个项目都描述一本书,那么更有用的变量名称将是 `书 `.这表明变量可能包含一个序列类型的对象,并且其中的每个对象都表示一本书。
```
books = json.loads(open('books.json'))
```
5. 类型 :如果您使用可选键入的语言(如 Python 或 JavaScript)进行编码,您可能需要考虑添加类型,至少添加到参数和返回值。这有助于缩小完成代码块的可能代码行。
```
def capitalize_titles(book_titles:list[str]) -> list[str]:
```
正如我在 1:46 的视频中所展示的那样,我有时会更改 Copilot 生成的代码的名称或类型,以便为后面的代码提供更多上下文。
无论您是否使用 GitHub Copilot,上述许多做法通常对您的代码库都有好处,例如描述性名称和类型注释。至于注释,我将块级注释保留在我的代码中,但删除了看起来多余的行级注释。您的最终代码有两个受众,计算机解释它和阅读它的人,因此请保持生成正确和清晰的代码的实践。
## 可预测
像GitHub Copilot这样的LLMS非常擅长模式。你给它看一个模式,它非常想保持这个模式。由于必须遵循语言的语法,编程本质上已经是模式填充的,但是有一些方法可以使程序更加“模式化”。
1. 变量命名约定 :使用更容易预测变量使用方式的命名方案,特别是如果该命名方案已经是该语言的约定。例如,Python 语言在技术上没有常量,但对于不应该更改的变量(如 PLANCK_CONSTANT)使用所有大写字母仍然是传统的。另一种约定是为保存类似数组对象的变量附加“s”后缀。您可能还具有特定代码库的约定,例如始终使用“_get_”启动 getter 函数。Copilot也会学习这些约定,如果你与它们保持一致的话。
2. 结构化软件架构:就像人类一样,Copilot在意大利面条代码方面做得并不好。什么功能去哪里?接下来会发生什么功能?对于您和 Copilot 来说,以可预测的方式组织您的代码确实很有帮助,特别是如果您可以使用流行的框架来执行此操作。例如,Python 的 Django 框架总是将代码模块化为“models.py”、“views.py”、“urls.py”和“模板”文件夹。当Copilot在其中一个文件中时,它可以更好地了解属于那里的内容。
## 使用Copilot
我最后的提示不是关于如何使用Copilot本身,而是关于如何将VS Code与Copilot一起使用。VS Code 基本上可以成为您的另一个结对程序员,通过安装 linting 工具并使它们能够实时工作。这样,如果 Copilot 确实给出了一个错误的建议(例如旧方法名称或不正确的函数调用链),您将立即看到波浪线。
![Screenshot of Python code with squiggly line under one line](https://www.inoreader.com/camo/s0NKtEaHK6d0v2sn8vvi_H23tRy1HIhyyBBm2WoPBJUM,b64/aHR0cHM6Ly9ibG9nZ2VyLmdvb2dsZXVzZXJjb250ZW50LmNvbS9pbWcvYi9SMjl2WjJ4bC9BVnZYc0VnV3FwSzBDX2RPRTBTNzVqMGd2NHVmdHZCZFFFeGIxUGxlTGtUWnhuTktBdFBSYlVOLUpZX0pZVTlZdTFnSXd3YXpCZlpzZ09zS1hNakVIdlR3Qi1UQ0V2VlRrenRHVGswU002RGlpODlKZndKM1Vnc2pUb2VpdlZjZFJwQUY1NmVfejIxX2wzMXZqbW1wS3VySEtkUnFKSE9ueklINlJFdHo1cWlYTTVWS293VDJHb0ROLTJGaTFVSTQ2dy9zMTYwMC9zcXVpZ2dsZXMucG5n)
然后,您可以将鼠标悬停在波浪线上以查看错误报告,并检查函数的智能感知以查看其预期参数和返回值。如果仍然不确定如何修复它,请搜索相关文档以获取更多指导。如果您启用了Copilot聊天,您甚至可以尝试要求Copilot修复它。
当然,Copilot无法捕获所有问题,因此您仍然应该运行代码并编写测试以对代码充满信心。但是 linters 可以捕获很多问题并防止您的代码走上错误的道路,因此我建议在任何 Copilot 设置中使用实时 linters。
对于 Python 中的 linting,我通常使用 Ruff 扩展以及以下设置:
```
“python.linting.enabled”: true, “[python]”: { “editor.formatOnSave”: true, “editor.codeActionsOnSave”: { “source.fixAll”: true } }
```