Для меня моим Mac OS является Мохаве. и я сталкиваюсь с той же проблемой в течение трех дней и в конце, я просто пишу корректный путь в .bash_profile файле, который похож на это:
export PATH=/Users/[YOURNAME]/development/flutter/bin:$PATH
e [0] не кодируется с помощью latin-1; просто так получилось, что байт \ xbd при декодировании как latin-1 является символом U + 00BD.
Преобразование происходит в Objects / floatobject.c
.
Во-первых, юникод строка должна быть преобразована в байтовую строку. Это выполняется с помощью PyUnicode_EncodeDecimal ()
:
if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
PyUnicode_GET_SIZE(v),
s_buffer,
NULL))
return NULL;
, который реализован в unicodeobject.c
. Он не выполняет никакого преобразования набора символов, он просто записывает байты со значениями, равными порядковому номеру строки в кодировке Unicode. В этом случае U + 00BD -> 0xBD.
Оператор форматирует ошибку:
PyOS_snprintf(buffer, sizeof(buffer),
"invalid literal for float(): %.200s", s);
где s
содержит строку байтов, созданную ранее. PyOS_snprintf ()
записывает байтовую строку, а s
является байтовой строкой, поэтому она просто включает ее напрямую.
Очень хороший вопрос!
Я взял на себя смелость покопаться в исходном коде Python, который представляет собой простую команду для правильной настройки дистрибутивов Linux ( apt-get source python2. 5
)
Черт , Джон Милликин меня опередил. Правильно, PyUnicode_EncodeDecimal
- это ответ, который он делает здесь:
/* (Loop ch in the unicode string) */
if (Py_UNICODE_ISSPACE(ch)) {
*output++ = ' ';
++p;
continue;
}
decimal = Py_UNICODE_TODECIMAL(ch);
if (decimal >= 0) {
*output++ = '0' + decimal;
++p;
continue;
}
if (0 < ch && ch < 256) {
*output++ = (char)ch;
++p;
continue;
}
/* All other characters are considered unencodable */
collstart = p;
collend = p+1;
while (collend < end) {
if ((0 < *collend && *collend < 256) ||
!Py_UNICODE_ISSPACE(*collend) ||
Py_UNICODE_TODECIMAL(*collend))
break;
}
Видите, он оставляет все кодовые точки Unicode <256 на месте, которые являются символами latin-1, на основе обратной совместимости Unicode.
Addendum
После этого вы можете проверить, попробовав другие символы, отличные от latin-1, оно вызовет другое исключение:
>>> float(u"ħ")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'decimal' codec can't encode character u'\u0127' in position 0: invalid decimal Unicode string
Поэкспериментировав с вашим фрагментом кода, похоже, что у меня такое же поведение на моей платформе (Py2 .6 в OS X 10.5).
Поскольку вы установили, что e [0] закодирован с помощью latin-1
, правильный способ преобразовать его unicode
- сделать ] .decode ('latin-1')
и не unicode (e [0])
.
Обновление: Похоже, что e [0] делает не иметь действительной кодировки. Определенно не latin-1
. Из-за этого, как упоминалось в другом месте в комментариях, вам придется вызвать repr (e [0])
, если вам нужно отобразить это сообщение об ошибке, не вызывая каскадного исключения.
Кодировка ASCII включает только байты со значениями <= 127
. Диапазон символов, представленных этими байтами, идентичен в большинстве кодировок; другими словами, «A» - это chr (65)
в ASCII, в latin-1, в UTF-8 и т. д.
Однако половина символа не является частью Набор символов ASCII, поэтому, когда Python пытается закодировать этот символ в ASCII, он ничего не может сделать, кроме как потерпеть неудачу.
Обновление: Вот что происходит (я предполагаю, что мы говорим о CPython):
float (u ' \ xbd ')
приводит к вызову PyFloat_FromString
в floatobject.c . Эта функция, предоставляя объект Unicode, в свою очередь вызывает PyUnicode_EncodeDecimal
в unicodeobject.c вызываемого. От беглого просмотра кода, Я понял, что эта функция превращает объект unicode в строку, заменяя каждый символ кодовой точкой Unicode <256
байтом этого значения, т.е. половина символа, имеющая кодовую точку 189, превращается в chr (89)
.
Затем PyFloat_FromString
выполняет свою работу как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т. п., поэтому возникает ошибка значения.
Аргументом этого исключения является строка
"invalid literal for float(): " + evil_string
Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.
256 с байтом этого значения, т.е. половина символа, имеющая кодовую точку 189, преобразуется в chr (89)
.
Затем PyFloat_FromString
выполняет свое работать как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.
Аргументом этого исключения является строка
"invalid literal for float(): " + evil_string
Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.
256 с байтом этого значения, т. Е. Половина символа, имеющая кодовую точку 189, превращается в chr (89)
.
Затем PyFloat_FromString
выполняет свое работать как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.
Аргументом этого исключения является строка
"invalid literal for float(): " + evil_string
Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.
PyFloat_FromString
выполняет свою работу как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.
Аргументом этого исключения является строка
"invalid literal for float(): " + evil_string
Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.
PyFloat_FromString
выполняет свою работу как обычно. На данный момент он работает с обычной строкой, которая, как оказалось, содержит байт диапазона, отличный от ASCII. Его это не волнует; он просто находит байт, который не является цифрой, точкой и т.п., поэтому вызывает ошибку значения.
Аргументом этого исключения является строка
"invalid literal for float(): " + evil_string
Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.
Аргументом этого исключения является строка
"invalid literal for float(): " + evil_string
Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.
Аргументом этого исключения является строка
"invalid literal for float(): " + evil_string
Это нормально; сообщение об исключении - это, в конце концов, строка. Только когда вы пытаетесь декодировать эту строку, используя кодировку по умолчанию ASCII, это превращается в проблему.