【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.tools是Tools类的实例,里面有search和calculate两个方法。action是一个字符串,比如"search"或"calculate"。- 所以
getattr(self.tools, action)就等价于self.tools.search或self.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 灵活地根据用户输入选择不同的工具方法。
如还不明白可以举例说明!

浙公网安备 33010602011771号