如何避免以“0”开头的python数字文字被视为八进制?

时间:2012-07-16 22:22:43

标签: python octal pep

我正在尝试编写一个小的Python 2.x API来支持获取 job jobNumber,其中jobNumber以整数形式提供。 有时,用户提供jobNumber作为整数文字 从0开始,例如037537。 (这是因为他们一直都是 被R娇恼,这是一种明智地考虑037537==37537的语言。) 但是,Python会考虑以“0”开头的整数文字 是OCTAL,因此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。

2 个答案:

答案 0 :(得分:6)

  

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

是的,我认为鉴于这种情况,这是一个合理的选择。

另一种选择是确保所有作业号码至少包含一个大于7的数字,这样添加前导零将立即给出错误而不是错误的结果,但这似乎比使用字符串更大的黑客攻击

最后一个选项可能是教育您的用户。只需要五分钟左右的时间来解释不添加前导零,如果你这样做会发生什么。即使他们因旧习惯而忘记或意外添加零,如果他们之前听说过,他们更有可能发现问题。

答案 1 :(得分:0)

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

test = "001234505"
test = int(test.lstrip("0"))  # 1234505