Python用于在>&燃气轮机&燃气轮机;而且。。。交互式控制台中的提示?

Python用于在>&燃气轮机&燃气轮机;而且。。。交互式控制台中的提示?,python,console,ironpython,interactive,read-eval-print-loop,Python,Console,Ironpython,Interactive,Read Eval Print Loop,我正在实现一个定制(Iron)Python控制台 通常,我需要显示一个>提示,但当语句不完整时,我需要将提示更改为..,并在执行它们之前收集更多行 如何知道用户输入的行是否完整,或者是否需要阅读更多行 一种简单的方法似乎是检查是否存在:。但我不确定我是否错过了其他不存在:的案例 我查看了IronPython源代码以了解它是如何做到这一点的,但涉及到许多步骤,我的简单复制未能完全成功。您使用了:或\(或未闭合的分隔符,如括号或括号)?交互式解释器显示一个… 实际逻辑可能要复杂一些,但这是基本规则。

我正在实现一个定制(Iron)Python控制台

通常,我需要显示一个
>
提示,但当语句不完整时,我需要将提示更改为
..
,并在执行它们之前收集更多行

如何知道用户输入的行是否完整,或者是否需要阅读更多行

一种简单的方法似乎是检查是否存在
。但我不确定我是否错过了其他不存在
的案例


我查看了IronPython源代码以了解它是如何做到这一点的,但涉及到许多步骤,我的简单复制未能完全成功。

您使用了
\
(或未闭合的分隔符,如括号或括号)?交互式解释器显示一个


实际逻辑可能要复杂一些,但这是基本规则。

我可以想出几种不同的方法来获得
提示

  • 开始(或继续)一个区块
    • def foo():
  • 未闭合的圆括号、大括号、方括号(注意嵌套)
    • x=(
    • x={
    • x=[
  • 未闭合三引号字符串
    • x='''
  • 行尾的反斜杠:
    • x=\

repl循环具有对解析器的完全了解和访问权限。如果解析器状态是它所期望的不是语句,那么repl循环将生成一个
。对于未闭合的括号,下一行的语句将是非法的,因为没有可能包含语句的子表达式。在
之后,下一个预期标记始终是缩进,同样,语句始终是非法的。这就是为什么在repl循环的缩进块末尾总是需要键入一个空行的原因,因为您必须为语句提供结束标记才能成为下一个预期的生成规则。

这是一种改进ctical试图通过查看冒号和方括号的代码字符串进行猜测。您最终需要实现一半的Python解析器才能做到这一点

标准库模块再现了交互式Python解释器的行为,我相信IronPython使用这个模块来实现其控制台(Python-one不是在Python中实现的)

您感兴趣的行延续逻辑来自函数


这是一个小技巧。本质上,它尝试使用晦涩的
PyCF\u don\u implie\u DEDENT
标志
compile()
给定代码,这意味着它不会假设任何打开的缩进在块的末尾自动关闭。然后,它尝试使用添加的新行再次编译它(导致显式缩进)。如果第二个有效,但第一个无效,则您有一个潜在的延续,可以在块中键入更多。

Hackish,但在野外可以看到,因此+1