Как вызвать функцию с параметрами только для позиции, учитывая словарь аргументов?

#python #signature #pep570

#python #подпись #pep570

Вопрос:

Ранее я использовал Signature.bind(argument_dict) для превращения словаря аргументов в BoundArguments объект, который имеет .args и .kwargs который может быть передан функции.

 def foo(a: str, b: str, c: str): ...
    
argument_dict= {"a": "A", "c": "C", "b": "B"}

import inspect
sig = inspect.signature(foo)

bound_arguments = sig.bind(**argument_dict)
foo(*bound_arguments.args, **bound_arguments.kwargs)
  

Но это, похоже, невозможно, когда функция имеет параметры только для позиции.

 def foo(a: str, /, b: str, *, c: str): ...
    
import inspect
sig = inspect.signature(foo)

argument_dict= {"a": "A", "b": "B", "c": "C"}
bound_arguments = sig.bind(**argument_dict) # Error: "a" is positional-only
  

Как мне программно вызвать функцию в этом случае?

Это собственный способ построения BoundArguments из словаря аргументов?

Ответ №1:

Я мог найти только что-то подобное, используя только позиционные параметры из dict:

 pos_only = [k for k, v in sig.parameters.items() if v.kind is inspect.Parameter.POSITIONAL_ONLY]
positionals = [argument_dict.pop(k) for k in pos_only]
bound_arguments = sig.bind(*positionals, **argument_dict)