Как избежать числовых литералов python, начинающихся с "0", рассматриваемых как восьмеричные?

Я пытаюсь написать небольшой API Python 2.x для поддержки получения 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 в некотором роде, поскольку для этого требуется изменение lexer по крайней мере.

Кто-нибудь знает, как я могу защитить своих пользователей от получения неправильная работа в таких случаях? На данный момент лучшее, что я могу думать из этого заключается в том, чтобы изменить этот API, чтобы он принимал строку вместо int.

Ответ 1

На данный момент лучшее, что я могу придумать, - это изменить этот API, чтобы он взял строку вместо int.

Да, и я думаю, что это разумный вариант, учитывая ситуацию.

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

Конечным вариантом может быть обучение ваших пользователей. Это займет всего пять минут или около того, чтобы объяснить, чтобы не добавить начальный ноль, и что может произойти, если вы это сделаете. Даже если они забывают или случайно добавляют нуль из-за старых привычек, они с большей вероятностью обнаруживают проблему, если они слышали об этом раньше.

Ответ 2

Возможно, вы могли бы взять ввод как строку, перенести ведущие нули, а затем преобразовать обратно в int?

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