【问题标题】:Python terminology- what are the extra REPL outputs called?Python 术语 - 什么是额外的 REPL 输出?
【发布时间】:2020-08-07 12:14:47
【问题描述】:

考虑以下代码:

class Greet:
    def __init__(self, greeting='Hello'):
        print(greeting)

if __name__ == '__main__':
  print('Initializing and assigning')
  greet = Greet('Shalom!')
  print('Only initializing a class')
  Greet()

如果我运行脚本,我会得到输出:

Initializing and assigning
Shalom!
Only initializing a class
Hello

但是,假设我在交互式 REPL 中运行上述代码,交互如下:

In 1> greet = Greet('Shalom!')
Shalom!
In 2> Greet()
Hello
<__main__.Greet object at 0x7fac80cc84c0>

如果您注意到,在第二个输入(即Greet())中,我会得到第二行,我相信该对象的repr 会导致输入的评估。这个额外的输出叫什么?因为在我看来,这是 REPL 本身的一个怪癖。

【问题讨论】:

  • 在交互式 shell 中,将打印任何评估为非None 值的表达式(不是赋值)。这不会发生在脚本中。除了实际的 print 语句之外,您还会看到此输出。如果你改用greet2 = Greet(),那么你就不会看到这个了。
  • 谢谢。这就是答案!

标签: python read-eval-print-loop


【解决方案1】:

从上面的 cmets 复制实际答案:

在交互式 shell 中,任何表达式(不是赋值)计算 将打印到非None 值。这不会发生在 脚本。除了实际打印之外,您还会看到此输出 陈述。如果您改为使用greet2 = Greet(),那么您 不会看到这个。

但是发布这个答案是为了做出不符合评论格式的额外评论......你可能无论如何都不想让你的对象执行 action初始化——最好把它放到一个单独的方法中:

>>> class Greeter:
...     def __init__(self, greeting='Hello'):
...         self.greeting = greeting
...     def greet(self):
...         print(self.greeting)
... 
>>> greeter = Greeter()
>>> greeter.greet()
Hello

在任何情况下你都看不到任何额外的行,因为greet 方法返回None

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2011-05-27
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多