Другими словами, у меня есть функции, которые имеют подпись, как это:
Код: Выделить всё
def f(*args, kw: T, **kwargs): ...
< /code>
Я хочу, чтобы их подпись подсказки, как если бы она была определена так: < /p>
def f(*args, kw: T | None=None, **kwargs): ...
Код: Выделить всё
def decorator(func):
sig = inspect.signature(func)
hints = get_type_hints(func)
orig_ann = hints.get("kw")
new_ann = Optional[orig_ann]
new_params = []
for param in sig.parameters.values():
if param.name == "kw":
new_params.append(
param.replace(
annotation=new_ann,
default=None,
)
)
else:
new_params.append(param)
new_sig = sig.replace(parameters=new_params)
@wraps(func)
def wrapper(*args, **kwargs):
if kwargs.get("kw") is None:
kwargs["kw"] = some_function_or_something()
return func(*args, **kwargs)
"do something to update the signature"
return wrapper
Подробнее здесь: https://stackoverflow.com/questions/796 ... ptional-in