[devel] python encodings

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Ноя 18 03:41:13 MSK 2007


On Sat, Nov 17, 2007 at 10:38:27AM +0300, Anton Farygin wrote:
> Мне кажется, что достаточно было бы вывести вменяемую диагностику. По 
> крайней мере в моём случае.

Я сделал вменяемую диагностику, насколько это возможно.

$ hsh --init
..
rpm-build-python-0.32-alt1
...
$ hsh-shell
$$ cd
$$ echo '# coding: utf8' >test.py
$$ /usr/lib/rpm/python.req test.py
python.req: test.py: non-standard encoding: utf8
python2.4(encodings)
python.req: ERROR: test.py: 
python.req: maybe you need python-modules-encodings
Traceback (most recent call last):
  File "/usr/lib/rpm/python.req.py", line 178, in ?
    import encodings
ImportError: No module named encodings
$$ 

Вообще-то MemoryError в данном случае -- это питоновский баг
http://bugs.python.org/issue979739

> > Думаю, захачить на эту тему python-base или нет.  То есть чтобы он
> > понимал побольше настандартных алиасов для стандартных кодировок,
> > без заглядывания в encodings.
> 
> Если нестантартные алиасы являются стандартом де-факто (т.е. - 
> значительно распространены), то видимо стоит хачить питон. В обратном 
> случаае - выводить вменяемую диагностику и патчить приложения.

Посмотрим, насколько они распространены.

Parser/tokenizer.c:
   183  static char *
   184  get_normal_name(char *s)        /* for utf-8 and latin-1 */
   185  {
   186          char buf[13];
   187          int i;
   188          for (i = 0; i < 12; i++) {
   189                  int c = s[i];
   190                  if (c == '\0') break;
   191                  else if (c == '_') buf[i] = '-';
   192                  else buf[i] = tolower(c);
   193          }
   194          buf[i] = '\0';
   195          if (i > 3) { /* at least 4 characters */
   196                  const char *p = NULL;
   197                  switch (buf[0]) {
   198                  case 'u':
   199                          if (strncmp(buf, "utf-8", 5) == 0)
   200                                  p = buf + 5;
   201                          else if (strncmp(buf, "utf8", 4) == 0)
   202                                  p = buf + 4;
   203                          if (p && (*p == '\0' || *p == '-'))
   204                                  return "utf-8";
   205                          break;
   206                  case 'i':
   207                          if (strncmp(buf, "utf-8") == 0)
   208                                  p = buf + 5;
   209  
   210  
   211  
   212          if (strcmp(buf, "utf-8") == 0 ||
   213              strncmp(buf, "utf-8-", 6) == 0) return "utf-8";
   214          else if (strcmp(buf, "latin-1") == 0 ||
   215                   strcmp(buf, "iso-8859-1") == 0 ||
   216                   strcmp(buf, "iso-latin-1") == 0 ||
   217                   strncmp(buf, "latin-1-", 8) == 0 ||
   218                   strncmp(buf, "iso-8859-1-", 11) == 0 ||
   219                   strncmp(buf, "iso-latin-1-", 12) == 0) return "iso-8859-1";
   220          else return s;gg
   221  }

То есть у питона есть две стандартные кодировки, для которых почти
ничего не нужно -- utf-8 и iso-8859-1.  Но в модуле encodings
определяются дополнительные алиасы, в том числе для стандартных
кодировок.

Lib/encodings/aliases.py:
   395      # latin_1 codec
   396      '8859'               : 'latin_1',
   397      'cp819'              : 'latin_1',
   398      'csisolatin1'        : 'latin_1',
   399      'ibm819'             : 'latin_1',
   400      'iso8859'            : 'latin_1',
   401      'iso_8859_1'         : 'latin_1',
   402      'iso_8859_1_1987'    : 'latin_1',
   403      'iso_ir_100'         : 'latin_1',
   404      'l1'                 : 'latin_1',
   405      'latin'              : 'latin_1',
   406      'latin1'             : 'latin_1',
...
   486      # utf_8 codec
   487      'u8'                 : 'utf_8',
   488      'utf'                : 'utf_8',
   489      'utf8'               : 'utf_8',
   490      'utf8_ucs2'          : 'utf_8',
   491      'utf8_ucs4'          : 'utf_8',

Есть искушение внести некоторые из этих алисов в Parser/tokenizer.c,
чтобы уменьшить число падений при отсутствии encodings/aliases.py.
Посмотрим, что будет по результатам пересборки с новым rpm-build-python.
Потому что теперь в python.req.py будет диагностика "non-standard encoding:",
которая мимикрирует проверку в Parser/tokenizer.c.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20071118/14820ac2/attachment-0002.bin>


Подробная информация о списке рассылки Devel