Я обрабатываю строки и извлекаю из них числа с плавающей точкой, числа с плавающей точкой могут находиться в разных позициях внутри строк. Затем я заметил различное поведение между версиями 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