装饰器 什么是装饰器? 装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能
@decorator def func (): pass func = decorator(func)
实例 在不修改func源代码的前提下,计算并输出运行func用的时间
import timedef f (fun ): def inner (): start = time.time() fun() end = time.time() print (f"{end-start} s" ) return inner @f def func (): time.sleep(5 ) func()
补充:装饰器有括号时,被装饰函数被传给inner,无括号时传给f
插件 我为什么要学装饰器呢?因为插件示例出现了我看不懂的@ 但现在能看懂了,开写。 先看看官方示例
from nonebot import on_command from nonebot.rule import to_me from nonebot.matcher import Matcher from nonebot.adapters import Message from nonebot.params import Arg, CommandArg, ArgPlainText weather = on_command("weather" , rule=to_me(), aliases={"天气" , "天气预报" }, priority=5 ) ''' cmd: 指定命令内容 rule: 事件响应规则 aliases: 命令别名 permission: 事件响应权限 handlers: 事件处理函数列表 temp: 是否为临时事件响应器(仅执行一次) expire_time: 事件响应器最终有效时间点,过时即被删除 priority: 事件响应器优先级 block: 是否阻止事件向更低优先传递 state: 默认 state 注:to_me规则匹配与机器人有关的事件。 ''' @weather.handle() async def handle_first_receive (matcher: Matcher, args: Message = CommandArg( ) ): plain_text = args.extract_plain_text() if plain_text: matcher.set_arg("city" , args) ''' 其中Message是一个类,或者说消息序列,大概长这样 message = Message([ MessageSegment(type='text', data={'text':'hello'}), MessageSegment(type='image', data={'url':'http://example.com/image.png'}), MessageSegment(type='text', data={'text':'world'}), ]) ,而message.extract_plain_text()可以获得该消息序列的纯文本信息 再看Matcher类,前面说过这是个事件响应器。 其中有如下方法 send finish pause reject reject_arg reject_receive skip get_receive set_receive get_last_receive get_arg set_arg stop_propagation 其中set_arg 设置/覆盖一个 got 接收的参数。 上面的意思是给city参数或者说关键字赋值上海 ''' @weather.got("city" , prompt="你想查询哪个城市的天气呢?" ) async def handle_city (city: Message = Arg( ), city_name: str = ArgPlainText("city" ) ): if city_name not in ["北京" , "上海" ]: await weather.reject(city.template("你想查询的城市 {city} 暂不支持,请重新输入!" )) city_weather = await get_weather(city_name) await weather.finish(city_weather) async def get_weather (city: str ) -> str : return f"{city} 的天气是..."
大概分析得差不多了
下面自己写一个,网上找的机器人聊天api
from nonebot import on_commandfrom nonebot.rule import to_mefrom nonebot.matcher import Matcherfrom nonebot.adapters import Messagefrom nonebot.params import Arg, CommandArg, ArgPlainTextimport requests as rfrom urllib.parse import urlencodeai = on_command("陪我聊天" ,rule = to_me(), aliases={"聊天" , "聊会儿" }, priority=5 ) @ai.handle() async def handle_first_receive (matcher: Matcher, args: Message = CommandArg( ) ): plain_text = args.extract_plain_text() if plain_text: matcher.set_arg("city" , args) @ai.got("city" , prompt="好啊!聊什么?" ) async def handle_city (city: Message = Arg( ), city_name: str = ArgPlainText("city" ) ): if city_name=="不聊了" : await ai.finish("好吧!下次再聊!拜拜咯!" ) res = r.get("https://api.qingyunke.com/api.php?key=free&appid=0&" +urlencode({"msg" :f"{city_name} " })).json() await ai.reject(res["content" ])
Nice!大功告成!
满分是10分的话,这篇文章你给几分,您的支持将鼓励我继续创作!
本文作者: 聆听·彼岸本文链接: https://ltba.github.io/20221117060611.html 版权声明: 本站未注明转载的文章均为原创,所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议.转载请注明出处!