【问题标题】:What is the difference between `>>> some_object` and `>>> print some_object` in the Python interpreter?Python解释器中的`>>> some_object`和`>>> print some_object`有什么区别?
【发布时间】:2011-08-18 22:01:06
【问题描述】:

在解释器中,您可以只写一个对象的名称,例如解释器提示处的列表a = [1, 2, 3, u"hellö"],如下所示:

>>> a
[1, 2, 3, u'hell\xf6']

或者你可以这样做:

>>> print a
[1, 2, 3, u'hell\xf6']

这似乎与列表等效。目前我正在使用 hdf5 管理一些数据,我意识到上述两种方法之间存在差异。给定:

with tables.openFile("tutorial.h5", mode = "w", title = "Some Title") as h5file:
    group = h5file.createGroup("/", 'node', 'Node information')
    tables.table = h5file.createTable(group, 'readout', Node, "Readout example")

输出

print h5file

不同于

>>> h5file

所以我想知道是否有人可以解释 Python 在这两种情况下的行为差异?

【问题讨论】:

    标签: printing behavior python


    【解决方案1】:

    在终端中键入一个对象会调用__repr__(),它用于详细表示您正在打印的对象(明确)。当您告诉“打印”某些内容时,您正在调用__str__(),因此要求提供人类可读的内容。

    Alex Martelli 给出了很好的解释here。线程中的其他响应也可能说明差异。

    例如,看看日期时间对象。

    >>> import datetime
    >>> now = datetime.datetime.now()
    

    比较...

    >>> now
    Out: datetime.datetime(2011, 8, 18, 15, 10, 29, 827606)
    

    到...

    >>> print now
    Out: 2011-08-18 15:10:29.827606
    

    希望这能让它更清楚一点!

    【讨论】:

    • 对于 None 变量,键入该变量不会打印任何内容。然而print(repr(None)) 给了None。怎么会?
    【解决方案2】:

    交互式解释器将打印输入其中的每个表达式的结果。 (由于语句不求值,而是执行,这种打印行为不适用于print 本身、循环等语句)

    证明repr() 被 Niklas Rosenstein 所述的交互式解释器使用(使用 2.6 解释器):

    >>> class Foo:
    ...   def __repr__(self):
    ...     return 'repr Foo'
    ...   def __str__(self):
    ...     return 'str Foo'
    ...
    >>> x = Foo()
    >>> x
    repr Foo
    >>> print x
    str Foo
    

    所以虽然print 语句在交互式解释器中可能是不必要的(除非您需要str 而不是repr),但非交互式解释器不会这样做。将上述代码放在一个文件中并运行该文件将不会打印任何内容。

    【讨论】:

    • 是的,x会被打印出来,因为有打印语句;)
    • 哈,这很有趣。我编辑了答案以包含 print x 语句,以显示一个使用 str 和另一个 repr 并忘记修改最后一段。
    【解决方案3】:

    print 语句总是调用x.__str__() 方法,而(仅在交互式解释器中)只是调用对象x.__repr__() 调用的方法的变量。

    >>> '\x02agh'
    '\x02agh'
    >>> print '\x02agh'
    'agh'
    

    【讨论】:

    • 这是在哪里记录的?我没找到。
    • @jtbandes 不知道在哪里,但是你可以自己测试一下。 PS:有人可以格式化内联代码吗?它不适用于移动设备。谢谢!
    • 哈哈,我真的不知道在哪里,但肯定在文档的某个地方。
    • 你的意思是str(x)repr(x),而不是x.str()x.repr()
    • x.__str__()x.__repr__()
    【解决方案4】:

    查看 Python 文档:http://docs.python.org/reference/datamodel.html#object.repr

    object.repr(自我)

    Called by the repr() built-in function and by string conversions
    

    (反引号)来计算一个“官方”字符串表示 目的。如果可能的话,这应该看起来像一个有效的 Python 可用于重新创建具有相同对象的表达式 价值(给定适当的环境)。如果这是不可能的,一个 应该返回 <...> 形式的字符串。 返回值必须是字符串对象。如果一个类定义 repr() 而不是 str(),那么 repr() 也用于 该类实例的“非正式”字符串表示是 必填。

    This is typically used for debugging, so it is important that the
    

    表示信息丰富且明确。

    object.str(自我)

    Called by the str() built-in function and by the print statement
    

    计算对象的“非正式”字符串表示。这 与 repr() 的不同之处在于它不必是有效的 Python 表达式:可以使用更方便或更简洁的表示 反而。返回值必须是字符串对象。

    例子:

    >>> class A():
    ...    def __repr__(self): return "repr!"
    ...    def __str__(self): return "str!"
    ... 
    >>> a = A()
    >>> a
    repr!
    >>> print(a)
    str!
    >>> class B():
    ...    def __repr__(self): return "repr!"
    ... 
    >>> class C():
    ...    def __str__(self): return "str!"
    ... 
    >>> b = B()
    >>> b
    repr!
    >>> print(b)
    repr!
    >>> c = C()
    >>> c
    <__main__.C object at 0x7f7162efb590>
    >>> print(c)
    str!
    

    打印函数打印控制台每个参数__str__。喜欢print(str(obj))

    但在交互式控制台中,它会打印函数的返回值__repr__。如果没有定义__str__,可以使用__repr__

    理想情况下,__repr__ 意味着,我们应该只使用该表示来重现该对象。不同的类或代表不同值的对象之间不应相同,例如 datetime.time:

    但是__str__(我们从str(obj) 得到的)应该看起来不错,因为我们将它展示给用户。

    >>> a = datetime.time(16, 42, 3)
    >>> repr(a)
    'datetime.time(16, 42, 3)'
    >>> str(a)
    '16:42:03' #We dont know what it is could be just print:
    >>> print("'16:42:03'")
    '16:42:03'
    

    还有,抱歉英语不好:)。

    【讨论】:

      【解决方案5】:

      print(variable) 等于 print(str(variable))

      variable 等于 print(repr(variable))

      显然,h5file 对象的__repr____str__ 方法会产生不同的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 2011-03-26
        • 2015-10-06
        • 2015-10-28
        • 2011-06-28
        • 2021-04-08
        • 2014-08-10
        相关资源
        最近更新 更多