mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-12-12 14:35:45 +08:00
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
import inspect
|
|
from typing import Any, Dict, Callable
|
|
|
|
from loguru import logger
|
|
from pydantic.typing import ForwardRef, evaluate_forwardref
|
|
|
|
|
|
def get_typed_signature(call: Callable[..., Any]) -> inspect.Signature:
|
|
signature = inspect.signature(call)
|
|
globalns = getattr(call, "__globals__", {})
|
|
typed_params = [
|
|
inspect.Parameter(
|
|
name=param.name,
|
|
kind=param.kind,
|
|
default=param.default,
|
|
annotation=get_typed_annotation(param, globalns),
|
|
)
|
|
for param in signature.parameters.values()
|
|
]
|
|
typed_signature = inspect.Signature(typed_params)
|
|
return typed_signature
|
|
|
|
|
|
def get_typed_annotation(param: inspect.Parameter, globalns: Dict[str, Any]) -> Any:
|
|
annotation = param.annotation
|
|
if isinstance(annotation, str):
|
|
annotation = ForwardRef(annotation)
|
|
try:
|
|
annotation = evaluate_forwardref(annotation, globalns, globalns)
|
|
except Exception as e:
|
|
logger.opt(colors=True, exception=e).warning(
|
|
f'Unknown ForwardRef["{param.annotation}"] for parameter {param.name}'
|
|
)
|
|
return inspect.Parameter.empty
|
|
return annotation
|