2014-03-30 2 views
1

Я читал через pprint модуль Python, и заметил, что его safe_repr проверяет, является ли "locale" in sys.modules перед вызовом repr на str значение:Почему модуль pprint для Python проверяет `` locale 'в sys.modules`?

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 

Источник: https://github.com/python/cpython/blob/master/Lib/pprint.py#L315

В какой сценарий будет локаль повлиять значение repr(some_str)?

+0

США: 2.75, Франция: 2,75 например? – stark

+0

Почему это было бы актуально, если вход является 'str'? –

ответ

2

См. this thread и this one в списке рассылки Python-dev. Они описывают проблему, при которой пользователи в системах, где не-ASCII-символы печатаются (например, с акцентированными символами), нуждаются в repr, чтобы сохранить эти символы как есть, вместо того, чтобы показывать их как экранированные байтовые последовательности.

Я не уверен, что это причина для конкретного кода, который вы упомянули, но кажется правдоподобным, что это связано. Кажется странным, что isalpha также зависит от локали, поэтому я не уверен, как (или если) он действительно работает.

+0

А, да! Кажется, это так.Например, на моей машине без стандартного языка, 'u" \ xe9 \ xf1 \ u6f02 \ u4eae \ u0e4f \ u2661 "' при использовании алгоритма pprint выдаст 'u'éñ 漂亮 \ u0e4f \ u2661''. Благодаря! –

0

Во-первых, я не собираюсь это отвечать, потому что я не думаю, что это одно. Это было слишком большим для комментария, и есть несколько вещей, которые я хочу включить в этот пост.

Есть несколько причин, по которым он будет проверять locale.. Основная причина, о которой я думаю, состоит в том, что кодировка символов в строке сильно зависит от языкового стандарта. Во-вторых, когда присутствует объект locale, это может принудить локаль к форматированию строки способом, который не согласуется с тем, что хотел бы использовать метод объекта pprint.

Другая вещь, я нашел, заключается в том, что при работе в системе Windows. Если бы я сделать следующее:

>>> import sys 
>>> 'locale' in sys.modules 
True 

Однако, когда я запускаю тот же самый тест на моем счете оболочки GoDaddy:

>>> import sys 
>>> 'locale' in sys.modules 
False 

Так, это может быть способ, чтобы, среди прочего, быстро проверить, что вид операционной системы, на которой работает пользователь, и затем действовать соответствующим образом.

Кроме того, достаточно интересно, я выполнил следующий тест как на систему Linux и в системе Windows:

>>>import locale 
>>>locale.getdefaultlocale() 

Система Linux возвращенной:

(None, None) 

система Windows, возвращенной:

('en_US', 'cp1252') 

Итак, я думаю, что происходит, что некоторые из этих символов mig ht имеют различный вид кодирования и изменяют вывод того, что мы хотим показать(), чтобы показать нам. Я думаю, что эти зависящие от языка эффекты на кодировки символов и изменения в строках будут принуждать неоднородный вывод.

Смежные вопросы