我正在实现一个自定义(Iron)Python控制台.
我需要显示>>>通常提示,但是当语句不完整时,我需要将提示更改为…并在执行之前收集更多行.
我如何知道用户输入的行是否完整或者我是否需要阅读更多行?
一个简单的方法似乎是检查是否存在.但我不确定我是否错过了其他案例:不存在.
我查看了IronPython源代码,以了解它是如何做到这一点的,但是涉及很多步骤,我的简单再现无法完全发挥作用.
解决方法:
尝试从仅查看冒号和括号的代码字符串进行猜测是不切实际的.您最终需要实现一半的Python解析器才能做到这一点.
标准库code模块重现了交互式Python解释器的行为,我相信IronPython使用它来实现其控制台. (CPython本身并不是用Python本身实现的.)
您感兴趣的线路延续逻辑来自codeop.compile_command功能.
这有点像黑客.本质上,它尝试使用模糊的PyCF_DONT_IMPLY_DEDENT标志编译()给定的代码,这意味着它不会假设任何打开的缩进在块的末尾自动关闭.然后它尝试再次添加新行来编译它(导致显式DEDENT).如果第二个工作但第一个工作没有,你有一个潜在的延续,更多的可以键入块.