了解 bpython:具有 IDE 功能的 Python REPL2025年3月17日 | 阅读19分钟 使用 Python 解释器的默认设置,您可以从文件(REPL)运行脚本,或者在读-求值-输出循环中交互地执行代码。Python 自带的默认 REPL 尽管是一个探索语言和通过对代码输入进行快速反馈来学习其库的强大工具,但仍存在一些限制。幸运的是,有许多更方便、对程序员更友好的选项可用,例如 bpython。 与集成开发环境 (IDE) 类似,Python 使您能够无需在其他程序的上下文之间进行导航,就可以试验代码或快速测试一个想法。此外,Python 可以成为物理或在线课堂中的有效教学工具。 Python 初学者指南bpython 不是像 CPython、PyPy 或 Anaconda 那样的独立 Python 发行版,而是一个纯 Python 包,它充当您选择的 Python 解释器的薄包装器。由于您可以在任何特定的 Python 发行版、版本或虚拟环境之上使用 bpython,因此您拥有很大的灵活性。 该工具的名称中字母 B 代表该工具的最初创建者和维护者 Bob Farrell。 bpython 仍然是一个很受欢迎的 Python REPL,但它只拥有从功能齐全的 Python IDE 借用的一些基本功能,如语法高亮和自动补全。与这种简约的方法相反,数据科学社区更喜欢 IPython 这样的工具,它是另一个 Python REPL 替代品。IPython 添加了许多标准 Python 中不存在的独特命令和其他功能。 您可以通过多种方式在计算机上安装 bpython。您操作系统上的包管理器(如 Homebrew 或 APT)提供了 bpython 的预编译版本。 但是,它们很可能已过时,并且是为使用系统范围内的 Python 解释器而预先编程的。 尽管可以从其源代码手动构建 bpython,但建议使用 Pip 来设置最新版本的 bpython,并在虚拟环境中进行安装。 不幸的是,由于 bpython 依赖于 curses 库(该库仅在 macOS 和 Linux 等类 Unix 系统上可用),因此 bpython 不支持 Windows 原生。官方文档提到了一个使用非官方 Windows 二进制文件的解决方法,但该解决方法似乎不再有效。如果您使用的是 Windows,那么安装 Windows Subsystem for Linux (WSL) 然后从中运行 bpython 是您的最佳选择。 在各种虚拟环境中安装多个 bpython 副本是可以的。这使您可以在 bpython 和最初用于构建虚拟环境的特定 Python 解释器之间进行包装。 安装后,您可以使用以下两个命令之一来启动 bpython: 更可取的是使用第二个命令,它将 bpython 作为可运行的 Python 模块调用,并且更明确。通过这样做,您可以确保 bpython 程序正在当前激活的虚拟环境中运行。 另一方面,使用简单的 bpython 命令可能会默默地回退到全局安装的程序。此外,它可能被别名为另一个 shell 可执行文件,这将优先于本地 bpython 模块。 现在您知道了如何设置和使用 bpython 作为 Python REPL 的替代品,是时候探索它的主要功能了。无论您的经验水平如何,以下各节将向您展示 bpython 可以提高您作为 Python 程序员生产力的多种方法。 快速发现错误与 bpython 相比,Python 的标准 REPL 就像一台老式黑白电视机。尽管它能有效地传达信息,但有时您更希望看到彩色显示以获得更好的清晰度。在编辑代码时这一点尤其重要,因为每一个细节都很重要。因此,也许任何好的 IDE 或代码编辑器最常见的特性就是语法高亮和括号匹配。 bpython 包含这两个功能,尽管它只充当 Python REPL 的文本用户界面 (TUI)。括号匹配使保持括号的正确平衡更容易,而彩色的语法高亮则有助于快速识别代码的结构。请继续阅读以了解这些功能的使用方法。 语法高亮当您在 bpython 中键入命令时,它们会被分词为字符串、数字或布尔值等字面量,以及 Python 关键字、运算符、注释和变量。通过查看与每种分词类型相对应的颜色,您可以快速识别您正在处理的语言构造的类型。 ![]() Pygments 库在后台执行分词和着色,而不是 bpython 直接执行。稍后您将了解如何修改 bpython 中的颜色主题。 括号匹配Bpython 的 Python 语法高亮器还能告诉您代码中的开括号和闭括号是否平衡。当您键入闭括号时,Python 会突出显示相应的开括号,反之亦然。 ![]() 这适用于所有类型的 Python 括号,包括方括号([])、圆括号(())和花括号({})。更棒的是,当您的光标经过一对正确的括号时,bpython 会突出显示它们。这允许您将括号嵌套在一起。 提高您的打字速度和准确性您的打字速度以及对函数名、参数和其他细节的记忆将直接影响您使用标准 Python REPL 编写代码的速度。相比之下,bpython 提供了有用的建议,您可以通过按键自动完成来使用它们。此外,它还提供上下文历史记录并有助于正确的代码缩进。 这些功能可以减少您的打字时间,并帮助您避免恼人的错别字,从而使您能够更快、更高效地工作。 代码建议一旦您开始键入内容,bpython 就会使用 LEGB 规则搜索您当前的词法作用域、内置函数、全局变量和 Python 关键字,以查找名称匹配的对象。更多的字符将帮助您获得更具体的结果,因为它只匹配以特定字符集开头的名称。之后,建议列表将按字母顺序显示。 ![]() 如果您不小心越过,可以通过按 Tab 或 Shift+Tab 来循环浏览这些建议。当您的屏幕无法容纳内容时,这一点尤其有用。 借助代码建议,可以更轻松地通过类型内省来查找对象具有哪些属性和方法。 自动缩进在默认的 Python REPL 中,编写长代码块时必须手动缩进每一行。如果您习惯于在功能丰富的编辑器中编写代码,这可能会耗时、笨拙且容易出错。幸运的是,当您按下 Enter 键时,bpython 会自动为下一行插入适当的缩进。 ![]() bpython 的标准缩进是四个空格,这符合 PEP 8 指南中概述的 Python 编码约定。如果您想要不同的缩进大小,可以在 bpython 设置中更改匹配的 tab-length 设置。您可以通过按 Enter 键来结束当前代码块,而无需在该行输入任何内容。这将将缩进级别降低一级。 历史背景用户主目录中的 Python 历史记录。一个名为 .python_history 的文件包含您的命令历史记录。默认的 Python REPL 存储了您之前输入的行内命令的无限历史记录,包括来自已完成的解释器会话的命令。与许多其他工具一样,交互式 Python 解释器通过模仿或提供 GNU Readline 库的接口来控制历史记录。 .python_history 并且限制为 1,000 行。另一方面,配置允许您增加 bpython 历史记录的默认限制,该历史记录单独存储在一个文件中。尽管如此,bpython 还会保留上下文历史记录,具体取决于您在代码中的位置,结果会有所不同。尽管存在这些差异,但访问历史记录的基本命令在概念上与标准 Python REPL 和 bpython 相同。 您可以不断地按键盘上的箭头键来遍历历史记录。 一次一行代码,使用向上箭头向前查看历史记录,使用向下箭头向后查看历史记录。按 Enter 键确认您的选择并重复之前的任何一条指令。 ![]() 请注意,bpython 的历史建议并不总是与其时间顺序相对应。bpython 会消除与您当前的缩进级别不匹配的建议。 与标准的 Python REPL 不同,当您开始键入已运行过的代码行时,bpython 也会考虑历史记录。 ![]() 一旦 bpython 找到以匹配字符序列开头的历史条目,它就会显示一个灰色的补全。您可以通过按键盘上的右箭头键来接受建议并自动完成,或者通过键入其他内容来拒绝它。 尽量避免切换上下文人类不擅长多任务处理,而计算机却擅长。在任务之间切换上下文时,您的大脑必须先保存每个任务的当前状态,然后才能切换到新任务并继续执行之前的任务。这会消耗时间和精力,增加出错的可能性,并降低生产力。由于程序员已经有很多事情要处理,您的工具应该限制上下文切换。 集成开发环境(IDE)通过将不同的软件开发工具集成到一个程序中来解决这个问题。 bpython REPL 的以下功能也为您提供了保持专注的方法:
您不再需要启动另一个程序来检查未知代码并承担忘记正在做什么的风险,因为这些信息就在您需要的地方。我们现在将详细检查每个功能。 运行时类型分析Python 的代码建议在任何地方都有效。其中之一是 Python 中的点运算符(.),它用于访问对象的成员。为了避免属性错误,通常需要提前知道类中声明的属性和方法的名称,或查阅相关的文档或源代码。幸运的是,bpython 可以在不离开终端的情况下实现运行时对象自省和属性过滤。 例如,假设您正在开发一个多线程应用程序,并且不记得 threading.Thread 类中某个特定方法或属性的确切名称。在这种情况下,您可以使用 bpython 如下: ![]() 解释:请记住,默认情况下,只显示公共可访问的成员,因为您通常不应该修改对象的内部实现。在极少数情况下,您可能想要访问或修改其内部。要在 bpython 中显示这些私有成员,请在点运算符后输入一个或多个下划线字符(_)。 由于 Python 支持运算符重载,许多名称以双下划线开头的建议成员是特殊方法。 REPL 知道当前会话中可导入的模块,包括 Python 标准库、使用 pip 安装的其他库以及项目文件夹中找到的自定义模块。在导入 Python 模块和包之前,您还可以使用 bpython 的建议来探索它们。在键入 import、一个空格和至少一个字符后按 Tab 键可显示以下建议: ![]() 与检查对象属性类似,bpython 中的内部模块除非您用前导下划线或双下划线请求,否则不会显示为建议。导入特定模块后,您可以使用相同的点运算符来查看其内容。 文档字符串和函数签名当您键入一个开括号来调用函数或方法时,bpython 会显示函数签名、形式参数及其默认值。此外,它还将说明参数是位置参数、仅位置参数、仅关键字参数还是仅关键字参数。 ![]() 解释:bpython 的一个很棒的功能是能够显示函数签名。调用函数时,Python 会突出显示函数签名中当前参数的名称,以显示还需要多少参数作为输入值。如果函数需要多个参数,这将非常有用。 遗憾的是,由于此功能不支持类型提示,因此不会显示参数的类型或函数的返回值,尽管它们存在于源代码中。此外,您会发现某些可调用对象(如 complex())不会调用相应的 bpython 函数签名。bpython 可能无法处理这些,因为它们通常实现为类,并带有特殊方法,使其看起来和行为像函数。 函数签名已经包含大量有用的详细信息,可以帮助您理解函数或方法的目的,而无需查阅其文档。在上面的示例中,bpython 显示了您的 sub() 函数和 Python 的内置 max() 函数的文档字符串。但是,如果 bpython 能够从源代码中定位并提取文档字符串,它会做得更多,通过显示函数体中的文档字符串。 文档字符串是一个多行字符串文字,紧跟在函数签名之后,并以人类可读的语言描述函数。它有时可能提供有关函数参数或作为函数自测试和用法示例的自动 doctest 的详细信息。自动显示文档字符串比访问 __doc__ 属性或 Python 中的内置 help() 函数更有效。 如果函数签名或文档字符串不足以满足您的需求,您可以使用 bpython 来显示底层源代码。 源代码一瞥现代代码编辑器允许您通过单击符号并按住特定的键盘键来导航到其定义。这会影响 Python 标准库、项目中的符号或您使用 pip 安装的第三方包。通过在 bpython 中输入特定符号后按 F2,您可以获得相关源代码的只读预览。 ![]() 解释:可以键入模块、函数或类的名称。您只会看到与该特定范围相关的源代码,具体取决于符号的类型。有趣的是,您还可以查询 REPL 会话中之前定义的类和函数的源代码。 单击源代码预览时,会打开您操作系统默认的终端分页程序,通常是 Unix 的 less 命令。使用箭头键、Page Up 和 Page Down 向上或向下滚动,或按 Q 退出当前页面。 您还可以通过使用正斜杠(/)进行搜索,使用 N 进行下一次查找,或使用 P 进行上一次查找。 无论您是使用 bpython 还是代码编辑器,此功能仅在纯 Python 源代码可访问时才有效。另一方面,如果符号是内置函数或以 C 编程语言扩展模块的形式创建的,您将无法了解任何信息。相反,bpython 会指示它找不到任何源代码。 更快地纠正错误标准 Python REPL 在代码编辑能力方面也存在不足。您会发现自己经常重复输入相同的代码行,因为在嵌套块中进行纠正而不重新开始会很困难。 即使有 bpython 的智能代码建议和自动补全功能,您有时在编写代码时仍可能出错,或者决定放弃某个特定的实现。bpython REPL 的多种有用功能使其易于编辑和重新评估您的代码,使您能够:
向前回溯一行或多行在使用标准的 Python REPL 时,如果您在代码块中间出错,您必须从头开始并重新输入整个代码块。在 bpython 中,您可以使用 Ctrl+R 来撤销最近的几行中的一行,并通过按键组合添加新行。 ![]() 解释:请注意,每次回溯一行代码时,bpython 都会从头开始运行整个 REPL 会话,包括之前执行的未编辑行。因此,在修改外部状态(例如写入文件、数据库或网络连接)时,您需要格外小心,以考虑任何不利影响。 回溯对于纠正您立即发现的错误非常有用,但对于纠正早期错误或进行重大更改并非理想选择。Bpython 提供了额外的解决方案。 使用外部编辑器编辑代码您可以通过按键盘快捷键 Ctrl+X,在 bpython REPL 中使用外部代码编辑器添加或更改代码。 ![]() 解释:如果您想定义一个新函数或一个完整的类,您可以在使用编辑器时添加多行代码。要编辑的行中可能已经存在 Python 指令,在这种情况下,bpython 会将其保存到临时文件中,然后再将其加载到外部编辑器中。完成后,请保存文件并退出编辑器以返回 bpython。 当您关闭编辑器时,bpython REPL 会知道。然后,与之前的回溯功能类似,它会将更新后的代码从临时文件注入到活动会话中并重新评估它。 除了编辑单行或一小段代码之外,您还可以编辑 bpython 中的整个 REPL 会话。按 F7 启动当前会话的编辑器。 ![]() 这次,您将看到 REPL 会话中的所有内容,包括来自先前指令的注释。bpython 在关闭编辑器后最终会重新评估您的会话,因此这些注释将不被考虑。 重新加载导入的模块使用 bpython,您可以使用任何代码编辑器更改本地模块或包中包含的辅助函数和类,并使这些更改立即在当前 REPL 会话中重新加载。更改导入的代码是测试和调试代码而无需重新启动 bpython 的好方法。 在 bpython 中按 F6 重新加载您在代码编辑器中保存的修改过的模块,然后评估自 REPL 启动以来的整个会话。 ![]() 解释:此功能是探索性测试的关键资源。重新加载模块会更新输出,同时保持当前 REPL 会话的指令的完整性。通过减少关闭、启动 Python 和重复输入相同指令的时间,可以提高生产力。 此外,bpython REPL 还支持自动模块重新加载,让您无需每次在外部编辑器中更改代码时手动按按钮。 请记住,当您手动重新加载模块或让 bpython 自动执行此操作时,整个会话都会被重新评估。在 bpython 中,按 F5 启用自动重新加载功能。 它将跟踪您导入的模块和包,并在每次保存其中一个文件时在当前打开的 REPL 会话中自动重新加载它们。它可以为您节省时间,并极大地改进手动模块重新加载。您可以按 F5 再次切换自动重新加载功能。 如您所见,bpython 提供了标准 Python REPL 所缺乏的多种代码编辑功能,使其更容易修复错误和重构代码。但 bpython 比这更通用!如果您是教师,您会重视能够导出 REPL 会话并以几种简单的方式与他人共享它的能力。 分享您的 REPL 会话您可以使用 bpython REPL 作为出色的教学工具来演示一个想法,然后向您的同事或课堂上的学生展示生成的代码片段。在 bpython 中写完内容后,您可以将其保存到文件中、在线共享,或将整个 REPL 会话(包括所有输出)复制到剪贴板。 剪贴板复制只需按一次键,您就可以将 REPL 会话的内容复制到剪贴板,这对于传递代码片段或将其粘贴到 Stack Overflow 中非常有用。但请注意,在 bpython 中,复制到剪贴板的功能默认是禁用的。在启用它之前,有必要将 pyperclip 库安装到虚拟环境中,以便 bpython 可以导入它。 安装后,启动 REPL 会话的默认快捷方式是 F10。这是向其他人提供工作代码示例的绝佳方式,特别是如果您想包含代码的结果。复制时会丢失语法着色,因此请将其粘贴到 Python 兼容的应用程序中以恢复颜色。 您可以将当前 REPL 会话直接保存到计算机上的本地文件,而不是手动将代码粘贴到消息应用程序或文本编辑器中。 保存文件将 bpython REPL 会话保存到文件的标准键盘快捷方式是大多数 Windows PC 程序使用的著名 Ctrl+S 组合键,用于此目的。 ![]() 它会提示您输入要在当前工作目录中创建的文件名,或者输入要保存到的位置的完整路径。如果文件已存在,您将可以选择覆盖、追加或取消操作。 Ctrl+S 组合键是 Unix shell 上用于停止程序输出的标准热键。覆盖 bpython 的默认操作会将一个独特的 XOFF 代码发送到终端以停止数据传输。 您可以使用终端会话键入以下命令来移除这种过时的软件流控制: 将 bpython 代码保存到文件的优点是,REPL 提示符(如三个箭头(>>>)或省略号(...))会被移除,使代码更易于执行。如果您想与他人共享代码,仍需要将文件作为附件发送。在这种情况下,将 REPL 会话发送到 Pastebin 会很有帮助。 发送到 Pastebinbpython 编程语言中共享代码的第三种方法是将您的 REPL 会话上传到 pastebin 或其他在线文本存储服务。bpython REPL 支持的默认 pastebin 服务是 bpa.st,一个 pinnwand 实例,但如果您愿意,可以将其更改为其他服务。按 F8 并确认您的选择(Y)后,稍作延迟,一个可共享的 URL 将会显示。 ![]() 键盘快捷键键盘快捷键与特定操作相关联,例如清除屏幕或显示源代码预览。使用以下语法定义唯一的键绑定: 生成的配置文件包含已注释掉的操作及其默认键盘快捷键的映射。其中一些可以更新并取消注释。例如,您可以将保存操作的快捷键重新映射到 F4,以避免与广泛使用的全局热键(用于暂停终端)冲突。 保存配置文件后,请记住重新启动 bpython 以使您的更改生效。bpython 仅在启动时读取一次配置文件。 发现 bpython 的细微差别与任何软件一样,bpython 也有其缺点。最大的缺点可能是它需要一些调整才能在 Windows 上运行。由于它依赖于 curses 库,因此您无法将其作为原生 Windows 应用程序(WSL)运行。安装 Python 使用 Windows Subsystem for Linux 是您的最佳选择。 当您第一次遇到时,标准 Python REPL 和 bpython 之间的细微显示和行为差异可能会让您感到惊讶。例如,Tracebacks 的显示略有不同。当代码粘贴到 bpython 中时,REPL 可能会冻结,直到整个代码运行完毕。打印特定的 ANSI 转义码也可能导致 bpython 崩溃。 最后,尽管 bpython 拥有悠久的历史,但尚未达到 1.0 版本。这表明该项目仍在变化中,并可能进行重大修改。然而,由于 bpython 目前相当成熟和可靠,所以似乎不太可能。 参与 bpython开源的、MIT 许可的 bpython REPL 的源代码托管在 GitHub 上。任何人都可以以各种方式为 bpython 做贡献,例如修复错误、改进文档、添加翻译或建议新功能。 如果您想留下自己的印记,请查看 bpython 项目的开放的 bitesize 标签的 GitHub issues。它们应该特别适合开始,并有助于您熟悉代码库。 首先,将 bpython 项目克隆到您的计算机,并在 GitHub 上以您的名字进行 fork。然后,在您的虚拟环境中,使用 Python 3.7 或更高版本以可编辑模式安装您的 bpython 副本,并创建和激活虚拟环境。 如果您在安装 bpython 时遇到问题,请尝试使用 setup.py 而不是 pyproject.toml 来安装 Python 包的这种过时方法。 必要的依赖项应该已经添加到您激活的虚拟环境中。您可以选择手动安装可能对开发或启用额外功能所需的任何其他依赖项。 bpython 的源代码现在是可编辑的。例如,当您启动 bpython 时,Python 版本横幅会显示在屏幕顶部。现在使用您喜欢的代码编辑器打开 args.py 模块。 当您运行该模块时,由于您以可编辑模式安装了 bpython,因此这些更改将立即在您的虚拟环境中可见。试试看!您看到的内容将类似于此。 您可以随心所欲地修改 bpython REPL。当您对修改满意时,请打开一个拉取请求到原始存储库,并准备贡献回馈。不错吧? 结论做得好!现在,您可以将 bpython REPL 添加到任何 Python 解释器之上,从而使您能够更改其设置并利用其所有 IDE 式功能。也许从现在开始,您会将 bpython 作为您的默认 Python REPL!您将能够满意地反思您所学到的关于 bpython 的所有知识以及它如何比默认 Python REPL 表现得更好。 学习新工具有时可能令人生畏。但是,如果您投入时间来熟悉 bpython,您将获得强大的功能并提高您作为 Python 程序员的生产力。 |
我们请求您订阅我们的新闻通讯以获取最新更新。