如何为VSCode创建Python类生成器

来自菜鸟教程
跳转至:导航、​搜索
      1. Introduction 如果您讨厌存根 Python 类,那么您可以在 Visual Studio Code 中创建一个扩展来为您做这件事。 在本文中,您将了解如何创建该扩展。 我们将使用几种技术来做到这一点。
  • 提示用户输入
  • 数组映射和连接函数
  • ES6 模板文字
  • 写入文件系统

您将创建一个新扩展,提示用户输入,将输入转换为代表新类文件的字符串,然后写出结果。

创建项目

要开始开发代码扩展,您需要安装两个不同的 NPM 包,“yo”和“generator-code”。

要生成您的项目,请运行以下命令。

yo code

这将通过询问您有关您的项目的几个问题来跟进。 为您的扩展程序选择 JavaScript 或 TypeScript。

回答完所有问题后,在 VS Code 中打开新创建的项目。

您将创建几个不同的文件,其中最重要的两个是 package.jsonextension.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 的机会,也是其他人将从中受益的东西。