Код: Выделить всё
class Player():
...
def _private_fun(): ...
@action(
param_type_factory={
"target": lambda player: Literal[tuple(player.opponents)]
}
)
def attack_action(self, target):
...
param_type_factory: Dict[
str,
Callable[[], Any]
]
< /code>
Таким образом, фабрика всегда получает экземпляр объекта = объект класса округа /> Текущий декоратор: < /p>
def tool_action(
description: str,
param_model_factory: Any, #
Текущий collect_tools для метода бэкэнда в классе Player: < /p>
def _collect_tools(self) -> List[ActionTool]:
tools: List[ActionTool] = []
for attr_name, method in inspect.getmembers(self, predicate=inspect.ismethod):
# check for "_tool_meta" attribute in own methods
meta = getattr(method, "_tool_meta", None)
if not meta:
continue
if callable(meta.get("param_model_factory")):
# factory returns a schema dict
new_sig = meta["param_model_factory"](self)
else:
new_sig = {}
# Create ActionTool
tools.append(
ActionTool(
func=method,
name=meta["name"],
description=meta["description"],
signature=new_sig,
)
)
return tools
< /code>
param_type_factory используется в коллекции с помощью экземпляра класса, в котором он находится (игрок). Все это работает во время выполнения. Я хочу исправить подсказки статического типа для param_factory, особенно, что объект типа «окружающий класс» передается. Возвращение объекта действия: < /p>
@action
def attack_action(self):
return Action(
attack,
param_type_factory={
"target": Tuple[self.opponents]
}
)
def attack(self, target):
...
< /code>
Но это сложно разделить метаданные от логики. Как написать более краткий, тип-безопасный/тип ритм/декоратор?
Подробнее здесь: https://stackoverflow.com/questions/797 ... in-wrapper