我正在阅读Python的pprint
模块,并注意到safe_repr
在"locale" in sys.modules
值repr
上调用str
之前检查def _safe_repr(object, context, maxlevels, level):
typ = type(object)
if typ is str:
if 'locale' not in _sys.modules: # <-------------------------------
return repr(object), True, False
if "'" in object and '"' not in object:
closure = '"'
quotes = {'"': '\\"'}
else:
closure = "'"
quotes = {"'": "\\'"}
qget = quotes.get
sio = _StringIO()
write = sio.write
for char in object:
if char.isalpha():
write(char)
else:
write(qget(char, repr(char)[1:-1]))
return ("%s%s%s" % (closure, sio.getvalue(), closure)), True, False
是否为repr(some_str)
: / p>
{{1}}
来源:https://github.com/python/cpython/blob/master/Lib/pprint.py#L315
在什么情况下,语言环境会影响{{1}}?
的值答案 0 :(得分:2)
请参阅Python-dev邮件列表中的this thread和this one。它们描述了一个问题,其中非ASCII字符可打印的系统上的用户(例如,重音字符)希望repr
按原样保留这些字符,而不是将它们显示为转义字节序列。
我实际上并不确定这是您提到的具体代码的原因,但似乎与其相关似乎是合理的。奇怪的是isalpha
也依赖于语言环境,所以我不确定它是如何(或者如果)实际运作的。
答案 1 :(得分:0)
首先,我不打算将此作为答案,因为我不认为这是一个答案。这对于评论来说太大了,我想在这篇文章中加入一些内容。
有几个原因可以检查locale.我认为,要注意的主要原因是字符串的字符编码在很大程度上取决于语言环境。第二件事是当存在locale
对象时,它可以强制语言环境以一种与pprint
对象方法所希望的方式不一致的方式格式化字符串。
我发现另一件事是,在Windows系统上运行时。如果我执行以下操作:
>>> import sys
>>> 'locale' in sys.modules
True
但是,当我在GoDaddy shell帐户上运行相同的测试时:
>>> import sys
>>> 'locale' in sys.modules
False
因此,这可能是一种方法,除其他外,快速检查用户正在运行的操作系统类型,然后采取相应措施。
另外,有趣的是,我在Linux系统和Windows系统上执行了以下测试:
>>>import locale
>>>locale.getdefaultlocale()
Linux系统返回:
(None, None)
Windows系统返回:
('en_US', 'cp1252')
所以,我认为正在发生的是,其中一些角色可能有不同类型的编码,并改变我们想要repr()向我们展示的输出。我认为,这些依赖于语言环境的字符编码和字符串更改会影响非均匀输出。