11

我正在尝试编写一个小型 Python 2.x API 来支持获取 jobby jobNumber,其中jobNumber以整数形式提供。有时用户会提供一个jobNumber以 0 开头的整数文字,例如037537. (这是因为它们被 R 宠坏了,R 是一种理智地认为 . 的语言037537==37537。)然而,Python 认为以“0”开头的整数文字是八进制,因此037537!=37537,而不是037537==16223。这让我觉得这是对最小意外原则的公然冒犯,幸运的是,这看起来在 Python 3 中已修复——参见PEP 3127

但我现在坚持使用 Python 2.7。所以我的用户这样做:

>>> fetchJob(037537)

默默地得到错误的工作(16223),或者这个:

>>> fetchJob(038537)
File "<stdin>", line 1
 fetchJob(038537)
            ^
SyntaxError: invalid token

Python 拒绝八进制不兼容的数字。

似乎没有提供任何东西__future__来让我获得 Py3K 行为——它必须以某种方式内置到 Python 中,因为它至少需要对词法分析器进行更改。

有谁知道在这种情况下我可以如何保护我的用户免于得到错误的工作?目前我能想到的最好的方法是更改​​该 API,使其采用字符串而不是 int。

4

2 回答 2

6

目前我能想到的最好的方法是更改​​该 API,使其采用字符串而不是 int。

是的,我认为考虑到这种情况,这是一个合理的选择。

另一种选择是确保所有工作编号至少包含一位大于 7 的数字,以便添加前导零会立即给出错误而不是错误结果,但这似乎比使用字符串更大。

最后的选择可能是教育您的用户。只需五分钟左右就可以解释不添加前导零以及如果这样做会发生什么。即使他们由于旧习惯而忘记或意外添加了零,如果他们以前听说过,他们更有可能发现问题。

于 2012-07-16T22:31:12.887 回答
0

也许您可以将输入作为字符串,去掉前导零,然后转换回 int?

test = "001234505"
test = int(test.lstrip("0"))  # 1234505
于 2017-07-05T17:03:07.813 回答