The rule of literal string
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Wed Dec 17 20:46:18 EST 2008
On Wed, 17 Dec 2008 15:25:41 -0800, Chris Rebert wrote:
> 2008/12/17 Li Han <lihang9999 at gmail.com>:
>> On 12月18日, 上午7时12分, Scott David Daniels <Scott.Dani... at Acm.Org>
wrote:
>> Scott wrote:
>>> Try: print repr(repr("'"))
>>> that might enlighten you.
>>
>> I found that print( repr( repr( arbitarystring ) ) ) == repr (
>> arbitarystring )
>
> As I stated previously, the key rule is:
>
> eval(repr(something)) == something
>
> That is, repr() gives a string of Python code that, when evaluated,
> results in what you gave to repr().
That is not true in general.
>>> from urllib2 import HTTPError
>>> h = HTTPError("404 quoth the Raven", None, None, None, None)
>>> eval(repr(h))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
TypeError: __init__() takes exactly 6 arguments (1 given)
Even for built-ins, it's not always true:
>>> eval(repr(float('inf')))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'inf' is not defined
In other words, there is no guarantee that repr(obj) will round-trip
correctly, or at all. It's a Nice To Have, and it will often work, but
it's not something you should rely on for arbitrary objects.
However, I believe it is true for strings.
--
Steven
More information about the Python-list
mailing list