В приведенном ниже примере я передаю значение с плавающей запятой функции, принимающей аргумент типа int (используя подсказки типа). Похоже, что значение, прочитанное в функции arg, тем не менее является числом с плавающей запятой (ожидалось int(11.2) * 10 = 110 вместо 112)
Почему это так?
def f(n:int):
return n*10
l = [11.2, 2.2, 3.3, 4.4]
mfunc = map(f,l)
print(list(mfunc))
Результат: [112,0, 22,0, 33,0, 44,0]
** Процесс завершен - Код возврата: 0 ** Нажмите Enter, чтобы выйти из терминала
Как правильно сказал @MechanicPig, неявное приведение не происходит, когда вы используете подсказку типа. Таким образом, вам придется выполнять кастинг явно. return int(n) * 10
Как сказал @Mechanic Pig, n:int
в сигнатуре функции - это просто подсказка для разработчика, и она не преобразуется в int.
Итак, вы бросаете в int
def foo(n: int):
if type(n) is float:
n = int(n)
return n * 10
Или вы можете использовать assert, чтобы вызвать ошибку, если n
не int
def foo(n: int):
assert type(n) == int, "must be int"
return n * 10
или
def foo(n: int):
if type(n) is not int:
raise Exception(f"Must by int instead of {type(n).__name__}")
return n * 10
Подсказки более полезны, когда вы используете IDE, которые их поддерживают.
Здесь -> int:
описывает, какой тип возвращает функция
def foo(n: int) -> int:
return n * 10
Как вы сказали, это просто подсказка типа. Он сообщает пользователю, что ожидает получить целое число, но никаких принудительных действий предприниматься не будет.