Как заставить mypy правильно проверять тип функции с помощью functools.partial?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как заставить mypy правильно проверять тип функции с помощью functools.partial?

Сообщение Anonymous »

Я пытаюсь создать функцию, которая возвращает частично примененный вызываемый объект, но сталкиваюсь с проблемами при проверке типа mypy.
Вот моя первая реализация:
Помогите мне объяснить мой вопрос о 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)
Mypy успешно проверяет
но не может запуститься

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)
Но я действительно хочу использовать Callable, потому что я работаю с функциями с большим количеством параметров, и гораздо проще просто сказать, какие параметры заменяются

Подробнее здесь: https://stackoverflow.com/questions/793 ... ls-partial
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»