Вот моя первая реализация:
Помогите мне объяснить мой вопрос о stackoverflow. т. е. найдите заголовок и тело
этого кода:
Код: Выделить всё
from collections.abc import Callable
from functools import partial
def f(i: int, j: float, k: int) -> int:
return i + int(j) + k
def g(a: float) -> Callable[[int, int], int]:
return partial(f, j=a)
fun: Callable[[int, int], int] = g(3.0)
r: int = fun(4, 5)
print(r)
но не может запуститься
r: int = fun(4, 5) TypeError: f() получила несколько значений для аргумента
'j'
, чтобы решить эту проблему , я вызываю функцию с именованным аргументом
Код: Выделить всё
from functools import partial
def f(i: int, j: float, k: int) -> int:
return i + int(j) + k
def g(a: float) -> Callable[[int, int], int]:
return partial(f, j=a)
fun: Callable[[int, int], int] = g(3.0)
# line 12 in my code (where the error message comes from)
r: int = fun(i=4, k=5)
print(r)
но проверка mypy не удалась
main. py:12: ошибка: неожиданный аргумент ключевого слова "i" [call-arg]
main.py:12: ошибка: неожиданный аргумент ключевого слова "k" [call-arg] Обнаружено 2
ошибки в 1 файле (проверено 1 источник файл)
Есть ли способ аннотировать этот код, чтобы он одновременно работал правильно и проходил проверку типа mypy? Я пробовал различные комбинации подсказок типов, но не нашел решения, которое бы удовлетворяло как поведению во время выполнения, так и статической проверке типов.
Я знаю, что есть такое решение без использования Partial.
Код: Выделить всё
from collections.abc import Callable
def f(i :int,j : float,k :int) ->int:
return i+int(j)+k
def g(a :float) -> Callable[[int,int],int]:
def ret(i,k):
return f(i,a,k)
return ret
fun :Callable[[int,int],int]= g(3.0)
r : int = fun(4,5)
print(r)
Подробнее здесь: https://stackoverflow.com/questions/793 ... ls-partial