【getattr】

result = getattr(self.tools, action)(**args)
# agent.py
class Memory:
    def __init__(self):
        self.log = []

    def save(self, message):
        self.log.append(message)

class Tools:
    def search(self, query):
        return f"🔍搜索结果:'{query}' 是一段示例数据"

    def calculate(self, expr):
        try:
            return f"🧮计算结果:{eval(expr)}"
        except:
            return "❌无效表达式"

class Agent:
    def __init__(self):
        self.memory = Memory()
        self.tools = Tools()

    def plan(self, input_text):
        if "天气" in input_text or "搜索" in input_text:
            return "search", {"query": input_text}
        elif any(c in input_text for c in "+-*/"):
            return "calculate", {"expr": input_text}
        else:
            return None, {}

    def act(self, input_text):
        self.memory.save(f"用户输入:{input_text}")
        action, args = self.plan(input_text)
        if action:
            result = getattr(self.tools, action)(**args)
            self.memory.save(f"Agent回应:{result}")
            return result
        else:
            return "🤔我不知道该怎么办"

if __name__ == "__main__":
    agent = Agent()
    while True:
        user_input = input("你说:")
        print("AI:", agent.act(user_input))

详细解释一下 result = getattr(self.tools, action)(**args) 这一句的含义:


1. getattr(self.tools, action)

  • getattr 是 Python 的内置函数,用于“根据字符串获取对象的属性或方法”。
  • self.toolsTools 类的实例,里面有 searchcalculate 两个方法。
  • action 是一个字符串,比如 "search""calculate"
  • 所以 getattr(self.tools, action) 就等价于 self.tools.searchself.tools.calculate,取决于 action 的值。

2. (**args)

  • args 是一个字典,比如 {"query": "天气"}{"expr": "1+2"}
  • (**args) 是“字典解包”,会把字典里的键值对作为参数传给方法。
    • 如果 args = {"query": "天气"},那么 (**args) 就等价于 query="天气"
    • 如果 args = {"expr": "1+2"},那么 (**args) 就等价于 expr="1+2"

3. 综合起来

假设 action = "search"args = {"query": "天气"},那么:

result = getattr(self.tools, action)(**args)
# 等价于
result = self.tools.search(query="天气")

如果 action = "calculate"args = {"expr": "1+2"},那么:

result = getattr(self.tools, action)(**args)
# 等价于
result = self.tools.calculate(expr="1+2")

总结

这一句的作用是:根据 action 字符串动态调用 Tools 里的方法,并把 args 字典里的参数传进去。
这样可以让 agent 灵活地根据用户输入选择不同的工具方法。

如还不明白可以举例说明!

posted @ 2025-06-09 19:33  十三山入秋  阅读(11)  评论(0)    收藏  举报