Python解释器中的>>> >>> some_object和print >>> some_object有什么不同?

问题描述:

在解释器中,您可以只写一个对象的名称,例如在这样解释提示列表a = [1, 2, 3, u"hellö"]Python解释器中的>>> >>> some_object和print >>> some_object有什么不同?

>>> 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的行为差异?

键入一个对象到终端呼叫__repr__(),其是用于所述对象的详细表示要打印(明确的)。当你告诉'打印'的东西时,你打电话给__str__(),因此要求一些可读的东西。

亚历克斯·马尔泰利给了一个很好的解释here。线程中的其他响应也可能会说明差异。

例如,看看datetime对象。

>>> 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 

希望这使得它更有点清楚!

print方法总是调用x.__str__()方法while(只在交互式interpeter中)简单地调用方法ia调用的变量对象x.__repr__()

>>> '\x02agh' 
'\x02agh' 
>>> print '\x02agh' 
'agh' 
+0

这是记录在哪里?我找不到它。 – jtbandes

+0

@jtbandes不知道在哪里,但你可以自己测试一下。 PS:有人可以请求格式化内联代码吗?它不适用于移动设备。谢谢 ! –

+0

当然,我可以测试它,这不是我问我:) – jtbandes

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

证明repr()被使用的交互式解释由尼克拉斯·罗森斯坦说(用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),非交互式解释并没有这样做。将上面的代码放在一个文件中并运行该文件将导致没有任何内容被打印。

+0

是的,x将被打印,因为有一个打印语句;) –

+0

哈,这很有趣。我编辑了包含'print x'语句的答案,以表明使用'str'和另一个'repr'并忘记修改最后一段。 – wberry

,我们来看Python文档:http://docs.python.org/reference/datamodel.html#object.repr

对象。 再版(个体)

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

(反向引号)来计算 对象的“正式”的字符串表示。如果可能的话,这应该看起来像一个有效的Python 表达式,它可以用来重新创建一个具有相同 值的对象(给定一个适当的环境)。如果这是不可能的,一个 字符串的形式< ...一些有用的描述...>应该被返回。 返回值必须是一个字符串对象。如果类定义 再版(),但不STR(),然后再版()也用于当这个类的实例的 “非正式”字符串表示是需要 。

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

表示信息丰富且毫不含糊。

对象。 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' 

而且,对不起英文不好:)。

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

variable等于print(repr(variable))

显然,物体h5file__repr____str__方法产生不同的结果。