Иногда может быть полезен мысленный эксперимент.
- Поведение A:
int('1.23')завершается ошибкой. Это существующее поведение.
- Поведение B:
int('1.23')производит 1без ошибок. Это то, что вы предлагаете.
С поведением A просто и тривиально получить эффект поведения B: int(float('1.23'))вместо этого используйте .
С другой стороны, с поведением B получить эффект поведения A значительно сложнее:
def parse_pure_int(s):
if "." in s:
raise ValueError("invalid literal for integer with base 10: " + s)
return int(s)
(и даже с помощью приведенного выше кода у меня нет полной уверенности в том, что не существует каких-то угловых случаев, с которыми он неправильно справляется.)
Таким образом, поведение A более выразительно, чем поведение B.
Еще одна вещь, которую следует учитывать: '1.23'это строковое представление значения с плавающей запятой. Преобразование '1.23'в целое число , концептуально включает в себя два преобразования (строку всплывать на целое число), но int(1.23)и int('1')каждый включает в себя только одну конверсии.
Редактировать:
И действительно, есть угловые случаи, которые приведенный выше код не обрабатывает: 1e-2и 1E-2оба они являются значениями с плавающей запятой.
type(3)возвращается<type int>. Однако питон на это не жалуетсяfloat("3"). Разве python не преобразует неявно строку в int, а затем в float?