在Python 3口译式输出(也许大约sys.displayhook?)(Interpreter-s

2019-10-17 04:28发布

我做了一个小玩具命令窗口,TK,目前试图使它复制一些解释的行为。

我以前从来没有仔细检查的解释,但对何时打印值决定是有点神秘。

>>> 3 + 4  # implied print(...)
7
>>> 3      # implied print(...)
3
>>> a = 3  # no output, no implied print(...), bc result is None maybe?
>>> None   # no output, no print(...) implied... doesn't like None?
>>> print(None)  # but it doesn't just ban all Nones, allows explicit print()
None
>>> str(None) # unsurprising, the string 'None' is just a string, and echoed
'None'

我们的目标是模仿这种行为,打印一些诺内斯,不是别人(稍微复杂一些做,因为我不能完全确定规则是什么)。

所以,把我的计划,我有history_text和entry_text,这是上面的控制在tk窗口输入框的标签STRINGVAR()秒。 那么下面的事件被绑定到回车键,处理命令和更新其结果的历史。

def to_history(event):
    print("command entered")  # note to debugging window

    last_history = history_text.get()

    # hijack stdout
    buffer = io.StringIO('')
    sys.stdout = buffer

    # run command, output to buffer
    exec(entry_text.get())

    # buffered output to a simple string
    buffer.seek(0)
    buffer_str = ''
    for line in buffer.readlines():
        # maybe some rule goes here to decide if an implied 'print(...)' is needed
        buffer_str = buffer_str + line + '\n'

    # append typed command for echo
    new_history = entry_text.get() + '\n' + buffer_str

    # cleanup (let stdout go home)
    sys.stdout = sys.__stdout__
    buffer.close()

    history_text.set(last_history + "\n" + new_history)
    entry_text.set('')

由于是,它不提供关于“3”或“无”或甚至“3 + 4”的一个简单的条目的任何输出。 添加一个隐含的print()语句中的所有的时间似乎过于频繁打印,我没有跳过“无”或“A = 3”类型的报表打印。

我发现sys.displayhook,这似乎支配翻译时将实际显示的结果一些文件,但我不知道如何在这里使用它。 我想我可能只是换sys.displayhook()在我的exec()调用,并让它做所有这些工作对我来说...却发现这并不意味着打印()像“3 + 4”或语句的表述'3'。

有什么建议么? 我在正确的轨道上sys.displayhook上?

Answer 1:

解释器打印出repr(result)仅当result is not None

有没有“隐含print的”像你这样想。

  • 3 + 4的结果至7 ,所以repr(7)被印刷
  • a = 3是一个任务,我觉得没有什么是印刷,因为它不与工作eval
  • None结果None ,所以没有印
  • print(None)结果,以None (因为print功能没有返回),因此没有打印。 然而, print功能本身打印None

老实说,我没有看过你的代码,但在这里,需要一个字符串代码和生成输出作为解释将相同的功能:

def interactive(code):
    try:
        result = eval(code)
        if result is not None:
            print(repr(result))
    except SyntaxError:
        exec(code)


文章来源: Interpreter-style output in Python 3 (maybe about sys.displayhook?)