【问题标题】:Why Python datatypes behave like this in Python prompt?为什么 Python 数据类型在 Python 提示符下的行为是这样的?
【发布时间】:2017-06-24 18:14:27
【问题描述】:

在终端中使用 python 时,我发现了一些奇怪的东西。如果您输入诸如1+2*3 之类的表达式,终端将输出 7,这很奇怪,因为它不应该打印任何东西,但它确实会打印。但是如果你使用诸如 print("hello world") 之类的函数,它将输出hello world,而不是None,这是 print 返回的内容。此外,输入True 输出TrueFalse 输出False,但输入None 不会输出任何内容。 python如何决定何时输出一个值?

【问题讨论】:

  • 交互式会话是一个 REPL。它读取、评估、打印和循环。
  • @brittenb 你对什么感到困惑?
  • Python 终端不是 Python 语言。
  • REPL 评估并打印表达式的结果以及您调用的任何函数的输出副作用。
  • @DanielGee:如果您运行交互式会话,行为会略有不同:如果您运行python file.py,它将显示中间表达式结果。

标签: python python-3.x terminal read-eval-print-loop


【解决方案1】:

评估表达式时发生的确切情况由sys.displayhook 确定。来自docs

sys.displayhook(value)

如果value不是None,该函数将其打印到sys.stdout,并保存在__builtin__._中。

sys.displayhook 在计算交互式 Python 会话中输入的表达式的结果时被调用。可以通过将另一个单参数函数分配给sys.displayhook 来自定义这些值的显示。

消除None 特殊情况的简单覆盖示例:

>>> def new_hook(x):
...   print(repr(x))
...   
>>> sys.displayhook = new_hook
>>> 3
3
>>> None
None

【讨论】:

  • 不错的答案亚历克斯!
【解决方案2】:

您看到的是 Python REPL(读取-评估-打印-循环)。

大多数 REPL(包括 Python 的 REPL)将使用 在线解析器:构建表达式树的解析器。从构建表达式树的那一刻起,REPL 就会评估它(这可以是函数定义,在这种情况下,函数会被解析和分析)。评估后,REPL 将获取结果并检查结果*。如果是None,则不打印结果。顺便说一下,分配也会发生同样的情况。

例如:

>>> None  # None is not printed
>>> a = 2 # assignments are not printed
>>> 

如果结果不是None,那么它将调用repr(..)内置方法,从而打印结果的文本表示。 p>

【讨论】:

  • 这是顶级表达式的情况,例如,您可以输入定义或块语句,其中函数调用根本不计算。
  • @pvg:嗯,它们是在 Python 读取 def x... 的意义上进行评估的,因此将构造一个语法树。但是当然,就像在 Python 中加载文件一样,不会评估函数。那会很奇怪,因为 Python 不知道哪些参数是有效的。
  • 它们被解析,而不是评估。如果您输入if exit(0):,解释器不会立即退出。
  • @pvg:是的,因为有一个开口缩进部分。
  • 它从来不是一个表达式。这是一个声明。
【解决方案3】:

终端中的 python 会话称为 REPL,或 Read-Evaluate-Print-Loop,它接受输入,评估它并返回结果。查看wikipedia page

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2022-01-26
    • 2021-11-08
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多