如何为VSCode创建Python类生成器
- Introduction 如果您讨厌存根 Python 类,那么您可以在 Visual Studio Code 中创建一个扩展来为您做这件事。 在本文中,您将了解如何创建该扩展。 我们将使用几种技术来做到这一点。
- 提示用户输入
- 数组映射和连接函数
- ES6 模板文字
- 写入文件系统
您将创建一个新扩展,提示用户输入,将输入转换为代表新类文件的字符串,然后写出结果。
创建项目
要开始开发代码扩展,您需要安装两个不同的 NPM 包,“yo”和“generator-code”。
要生成您的项目,请运行以下命令。
yo code
这将通过询问您有关您的项目的几个问题来跟进。 为您的扩展程序选择 JavaScript 或 TypeScript。
回答完所有问题后,在 VS Code 中打开新创建的项目。
您将创建几个不同的文件,其中最重要的两个是 package.json
和 extension.js
文件。
首先打开 extension.js
文件。 然后,将扩展命令名称重命名为 createPyClass
。
然后,在 package.json
文件中,重命名激活事件和命令以匹配命令的名称。
还要更新标题,这是用户将键入以激活命令的内容。
要运行扩展程序,请打开调试面板(看起来像一个错误)并按播放。 这将打开一个新的 VS Code 实例。 打开命令提示符 (Command+Shift+P 在 Mac 和 Control+Shift+ P 在 Windows 上)并输入“创建 Python 类”。
您应该会看到“Hello World”消息。
提示用户输入
我们需要提示用户输入有关类(类名和属性)的信息,并将该输入转换为可以写入新类文件的字符串。
让我们首先确保用户当前打开了一个文件夹。 如果没有,我们没有地方可以写入新的类文件。 如果用户没有打开文件夹,我们会显示错误消息并返回。
if (!vscode.workspace.workspaceFolders) { return vscode.window.showErrorMessage( "Please open a directory before creating a class." ); }
现在,我们可以询问用户他们想要创建的类的名称。 如果用户出于某种原因关闭了输入提示(通过点击转义),我们将返回。
const className = await vscode.window.showInputBox({ prompt: "Class Name?" }); if (!className) return;
我们想让用户输入任意数量的属性。 为此,我们最初提示输入属性,然后运行 while 循环检索属性,直到用户输入“完成”。
let count = 1; let property = await vscode.window.showInputBox({ prompt: `Property #${count}? ('done' when finished)` }); const properties = []; while (property != "done") { properties.push(property); count++; property = await vscode.window.showInputBox({ prompt: `Property #${count}? ('done' when finished)` }); }
重新运行您的扩展程序,输入有效的输入,然后打印用户信息以确保它看起来正确。
创建类内容字符串
现在,我们开始接受用户的输入来生成类的内容。 让我们从创建类定义行和构造函数定义开始。
const classDefinition = `class ${className}:`; const constructorDefinition = `def __init__(self, ${properties.join(", ")}):`;
然后,我们可以创建构造函数分配行。 这是用户将使用构造函数参数的值在其自身上初始化变量的地方。 为此,我们使用 map
(从现在开始)以某种方式转换每个属性输入。
const constructorAssignments = properties .map(property => `self.${property} = ${property}\n\t\t`) .join("");
现在,对于每个属性,我们创建一个 getter 函数。 同样,我们使用 map
将每个属性转换为表示其 getter 的字符串。
const classGetters = properties .map( property => `\tdef get_${property}(self):\n\t\treturn self.${property}\n\n` ) .join("");
我们要创建的最后一件事是告诉 Python 如何打印该对象的字符串函数。 同样,我们使用 map
函数通过打印属性名称和其值来转换每个属性。
请注意,在地图返回值中,我们添加了逗号和加号。 这意味着对于最后一个属性,我们将在最后添加不必要的字符。 出于这个原因,我们将结果数组转换为字符串,并使用 splice
删除最后 11 个字符。
const dunderStrString = `\tdef __str__():\n \t\treturn ${properties .map(property => '"' + property + ': "' + " + " + property + ' + " , " + ') .join("") .slice(0, -11)}`;
让我们把这些单独的部分放在一起!
const classString = `${classDefinition} ${constructorDefinition} ${constructorAssignments} ${classGetters} ${dunderStrString}`;
创建一个日志语句并再次运行它以确保您的类字符串看起来不错。
创建类文件
现在,我们需要将该字符串写入一个新文件。 要处理文件,我们需要从页面顶部的 Node 导入“fs”和“path”模块。
const fs = require("fs"); const path = require("path");
然后,我们需要获取用户当前打开的目录的路径。 您可以通过 vscode.workspace.workspaceFolders
获得对打开目录的引用。 然后,我们从结果数组中获取第一个,获取它的 URI,并将其转换为字符串。 生成的路径字符串包含一个前缀,因此我们通过在冒号上拆分并抓取冒号后面的内容来去除它。
const folderPath = vscode.workspace.workspaceFolders[0].uri .toString() .split(":")[1];
现在我们可以使用 fs 模块、文件夹路径和类文件的名称,将类字符串写入我们的新文件。
fs.writeFile(path.join(folderPath, `${className}.py`), classString, err => {});
我们可以更进一步,根据写入文件是否成功向用户提供一些反馈。
fs.writeFile(path.join(folderPath, `${className}.py`), classString, err => { if (err) { vscode.window.showErrorMessage("Something went wrong"); return console.log(err); } vscode.window.showInformationMessage(`${className} Class created.`); });
运行
刷新您的调试实例或按照上述步骤重新开始。 打开 VS Code 的调试实例后,再次运行“创建 Python 类”命令。 然后,输入要创建的类的名称。 在这种情况下是“人”。
然后输入您的属性,首先输入“名称”。
然后是“年龄”。
然后“完成”完成。
文件已成功创建。
然后,仔细检查您的文件是否实际创建并且看起来不错
结论
在本教程中,您创建了一个扩展来解决特定问题。 它提供了一个了解更多关于 VS Code 的机会,也是其他人将从中受益的东西。