Python3.6 приведение строки к плавающей - ошибка или функция? - PullRequest
0 голосов
/ 31 октября 2019

Я обрабатываю строки и извлекаю из них числа с плавающей точкой, числа с плавающей точкой могут находиться в разных позициях внутри строк. Затем я заметил различное поведение между версиями Python 2.7 и 3.6. Например, строка, содержащая нечисловые литералы, такие как _ Вот краткое изложение того, что я нашел:

Python 2.7:

In [3]: float('0_001')
ValueError: invalid literal for float(): 0_001

In [4]: 

Python 3.6:

In [16]: float( '0_001' )
Out[16]: 1.0

Поведение, которое я ожидаю от приведения, соответствует версии 2.7, и, поскольку растяжение между 0_001 и 1.0 довольно велико, я подозреваю, что это скорее ошибка в версии 3.6, но я могубыть неправым.

Если я заменим литерал _ в версии 3.6 чем-то другим, например, - * , и т. д., я получу ожидаемое ValueError:.

Если это не ошибка, а не как особенность, может кто-нибудь объяснить мне, почему приведение такого типа может быть допустимым?

Версия Python 2.7:

Python 2.7.16 (default, Apr  6 2019, 01:42:57) 
IPython 5.8.0 -- An enhanced Interactive Python.

Версия Python 3.6:

Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) 
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

Редактировать: Согласно ответу Сача, это актуальная особенность v3.6, но я до сих пор не понимаю, почему это так? Какую цель он служит?

In [2]: float( '0.0_1_2_3_4' )
Out[2]: 0.01234

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

PEP515 должен содержать ответ, который вы ищете.

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

Это общая черта других современных языков, и она может улучшить читаемость длинных литералов или литералов, значение которых должно четко разделяться на части,например, байты или слова в шестнадцатеричном формате.

Здесь также описаны правила их использования.

1 голос
/ 01 ноября 2019

Из исходного кода 1 и 2 , вы можете увидеть конкретную обработку для подчеркивания при преобразовании float из строки.

Этого нет в 2.7 и добавленоот 3.6

Проверяет наличие подчеркивания и следующих условий:

  1. Подчеркивания разрешены только после цифр.
  2. Знак подчеркивания допускается только перед цифрами.
  3. Подчеркивание не допускается в конце.
...