1

将带空格的字符串解析为整数从 Python2 更改为 Python3。

在 Python2 中是:

>>> int('-11')
-11
>>> int('- 11')
-11

而在 Python3 中:

>>> int('-11')
-11
>>> int('- 11')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '- 11'

弄清楚这一点后,我试图在文档中找到有关此更改的一些解释/详细说明,但找不到任何东西。

所以我的问题是:如何修改代码以从 py2 迁移到 py3?是i = int(s.replace(' ',''))要走的路吗?还是有更好的建议?有没有关于我刚刚没有找到的变化的描述?

4

3 回答 3

4

这在 Python 3 中针对问题 1779进行了明确更改:

我发现将字符串转换为 int 或 float 时,int 转换允许符号后有空格,而 float 转换则不允许。我认为它们应该是一致的。

这在3.0a3 更改日志中有所记录(问题编号中有错字):

  • 问题 #1769:现在不再允许使用 int("- 1")。

允许空格与其他数字转换不一致。

解决此问题的最快方法是使用str.replace(),是的:

>>> import timeit
>>> timeit.timeit('int("- 1".replace(" ", ""))')
0.37510599600500427
>>> timeit.timeit('int("- 1".translate(map))', 'map = {32: None}')
0.45536769900354557
>>> timeit.timeit('literal_eval("- 1")', 'from ast import literal_eval')
6.255796805999125
>>> timeit.timeit('int(extract("- 1"))', 'import re; from functools import partial; extract = partial(re.compile(r"[^\d\.\-]").sub, "")')
0.7367695900029503

Python 2.7 文档在事后通过向后移植 Python 3 文档进行了更新。它现在明确指出符号和数字之间不应有空格。所以正式地,不再支持空格,但是为了不破坏向后兼容性,这个错误被留下了。

于 2017-10-17T10:32:15.793 回答
2

在 Python 3 中似乎没有丢弃字符串文字中的空格,但是,当在数字文字中找到空格时,Python 解析器仍然会忽略空格:

>>> e = -   11
>>> e
-11

因此,您可以ast.literal_eval在 Python 2 和 3 中直接在输入字符串上使用,因此忽略空格:

>>> import ast
>>> ast.literal_eval('-      11 ')
-11
于 2017-10-17T10:23:02.617 回答
0

无需重新发明轮子。对于 PY2 && PY3

import re
int(re.sub(r'[^\d\-]', '', '- 11'))

测试

>>> int(re.sub(r'[^\d\.\-]', '', '- 11'))
-11
>>> int(re.sub(r'[^\d\.\-]', '', '+ 11'))
11
>>> int(re.sub(r'[^\d\.\-]', '', '+ 11easd'))
11
>>> int(re.sub(r'[^\d\.\-]', '', '+ 11easd3325'))
113325
于 2017-10-17T10:27:39.503 回答