🎨 impove typing

This commit is contained in:
yanyongyu 2020-12-07 00:06:09 +08:00
parent 629eed08b6
commit 6b3f6a46e6
27 changed files with 60 additions and 137 deletions

View File

@ -28,11 +28,11 @@ import importlib
import pkg_resources
from typing import Dict, Type, Optional
from nonebot.adapters import Bot
from nonebot.drivers import Driver
from nonebot.utils import escape_tag
from nonebot.config import Env, Config
from nonebot.adapters import BaseBot as Bot
from nonebot.log import logger, default_filter
from nonebot.drivers import BaseDriver as Driver
_dist: pkg_resources.Distribution = pkg_resources.get_distribution("nonebot2")
__version__ = _dist.version

View File

@ -15,10 +15,10 @@ from pydantic import BaseModel
from nonebot.config import Config
if TYPE_CHECKING:
from nonebot.drivers import BaseDriver as Driver, BaseWebSocket as WebSocket
from nonebot.drivers import Driver, WebSocket
class BaseBot(abc.ABC):
class Bot(abc.ABC):
"""
Bot 基类用于处理上报消息并提供 API 调用接口
"""
@ -141,7 +141,7 @@ class BaseBot(abc.ABC):
T = TypeVar("T", bound=BaseModel)
class BaseEvent(abc.ABC, Generic[T]):
class Event(abc.ABC, Generic[T]):
"""
Event 基类提供上报信息的关键信息其余信息可从原始上报消息获取
"""
@ -304,7 +304,7 @@ class BaseEvent(abc.ABC, Generic[T]):
@dataclass
class BaseMessageSegment(abc.ABC):
class MessageSegment(abc.ABC):
"""消息段基类"""
type: str
"""
@ -349,7 +349,7 @@ class BaseMessageSegment(abc.ABC):
return cls("text", {"text": text})
class BaseMessage(list, abc.ABC):
class Message(list, abc.ABC):
"""消息数组"""
def __init__(self,

View File

@ -10,8 +10,8 @@ import httpx
from nonebot.log import logger
from nonebot.config import Config
from nonebot.typing import overrides
from nonebot.adapters import BaseBot
from nonebot.message import handle_event
from nonebot.adapters import Bot as BaseBot
from nonebot.exception import RequestDenied
from .event import Event

View File

@ -2,7 +2,7 @@ import asyncio
from typing import Any, Dict, List, Union, Optional
from nonebot.config import Config
from nonebot.adapters import BaseBot
from nonebot.adapters import Bot as BaseBot
from nonebot.drivers import BaseDriver as Driver, BaseWebSocket as WebSocket
from .event import Event

View File

@ -1,7 +1,7 @@
from typing import Optional
from nonebot.typing import overrides
from nonebot.adapters import BaseEvent
from nonebot.adapters import Event as BaseEvent
from .message import Message

View File

@ -2,7 +2,7 @@ import re
from typing import Any, Dict, Union, Tuple, Iterable, Optional
from nonebot.typing import overrides
from nonebot.adapters import BaseMessage, BaseMessageSegment
from nonebot.adapters import Message as BaseMessage, MessageSegment as BaseMessageSegment
from .utils import log, escape, unescape, _b2s

View File

@ -6,8 +6,8 @@ from typing import Any, Union, Optional, TYPE_CHECKING
import httpx
from nonebot.log import logger
from nonebot.config import Config
from nonebot.adapters import BaseBot
from nonebot.message import handle_event
from nonebot.adapters import Bot as BaseBot
from nonebot.exception import RequestDenied
from .utils import log

View File

@ -1,6 +1,6 @@
from typing import Union, Optional
from nonebot.adapters import BaseEvent
from nonebot.adapters import Event as BaseEvent
from .message import Message
from .model import MessageModel, ConversationType, TextMessage

View File

@ -1,6 +1,6 @@
from typing import Any, Dict, Union, Iterable
from nonebot.adapters import BaseMessage, BaseMessageSegment
from nonebot.adapters import Message as BaseMessage, MessageSegment as BaseMessageSegment
from .utils import log
from .model import TextMessage

View File

@ -12,10 +12,10 @@ from nonebot.log import logger
from nonebot.config import Env, Config
if TYPE_CHECKING:
from nonebot.adapters import BaseBot as Bot
from nonebot.adapters import Bot
class BaseDriver(abc.ABC):
class Driver(abc.ABC):
"""
Driver 基类将后端框架封装以满足适配器使用
"""
@ -140,7 +140,7 @@ class BaseDriver(abc.ABC):
raise NotImplementedError
class BaseWebSocket(object):
class WebSocket(object):
"""WebSocket 连接封装,统一接口方便外部调用。"""
@abc.abstractmethod

View File

@ -23,7 +23,7 @@ from nonebot.typing import overrides
from nonebot.config import Env, Config
from nonebot.utils import DataclassEncoder
from nonebot.exception import RequestDenied
from nonebot.drivers import BaseDriver, BaseWebSocket
from nonebot.drivers import Driver as BaseDriver, WebSocket as BaseWebSocket
class Driver(BaseDriver):

View File

@ -20,9 +20,7 @@ from nonebot.typing import State, Handler, ArgsParser
from nonebot.exception import PausedException, RejectedException, FinishedException
if TYPE_CHECKING:
from nonebot.adapters import (BaseBot as Bot, BaseEvent as Event,
BaseMessage as Message, BaseMessageSegment as
MessageSegment)
from nonebot.adapters import Bot, Event, Message, MessageSegment
matchers: Dict[int, List[Type["Matcher"]]] = defaultdict(list)
"""

View File

@ -17,7 +17,7 @@ from nonebot.exception import IgnoredException, StopPropagation
from nonebot.typing import State, EventPreProcessor, RunPreProcessor, EventPostProcessor, RunPostProcessor
if TYPE_CHECKING:
from nonebot.adapters import BaseBot as Bot, BaseEvent as Event
from nonebot.adapters import Bot, Event
_event_preprocessors: Set[EventPreProcessor] = set()
_event_postprocessors: Set[EventPostProcessor] = set()

View File

@ -16,7 +16,7 @@ from nonebot.utils import run_sync
from nonebot.typing import PermissionChecker
if TYPE_CHECKING:
from nonebot.adapters import BaseBot as Bot, BaseEvent as Event
from nonebot.adapters import Bot, Event
class Permission:

View File

@ -27,8 +27,8 @@ plugins: Dict[str, "Plugin"] = {}
:说明: 已加载的插件
"""
_tmp_matchers: ContextVar[Set[Type[Matcher]]] = ContextVar("_tmp_matchers")
_export: ContextVar["Export"] = ContextVar("_export")
_tmp_matchers: ContextVar[Set[Type[Matcher]]] = ContextVar("_tmp_matchers")
class Export(dict):

View File

@ -10,8 +10,8 @@ from nonebot.typing import State, Handler, RuleChecker
plugins: Dict[str, "Plugin"] = ...
_tmp_matchers: ContextVar[Set[Type[Matcher]]] = ...
_export: ContextVar["Export"] = ...
_tmp_matchers: ContextVar[Set[Type[Matcher]]] = ...
class Export(dict):

View File

@ -4,7 +4,7 @@ from nonebot.rule import to_me
from nonebot.typing import State
from nonebot.plugin import on_command
from nonebot.permission import SUPERUSER
from nonebot.adapters import BaseBot as Bot, BaseEvent as Event, BaseMessageSegment as MessageSegment
from nonebot.adapters import Bot, Event, MessageSegment
say = on_command("say", to_me(), permission=SUPERUSER)

View File

@ -22,7 +22,7 @@ from nonebot.utils import run_sync
from nonebot.typing import State, RuleChecker
if TYPE_CHECKING:
from nonebot.adapters import BaseBot as Bot, BaseEvent as Event
from nonebot.adapters import Bot, Event
class Rule:

View File

@ -18,18 +18,10 @@
https://docs.python.org/3/library/typing.html
"""
from types import ModuleType
from typing import NoReturn, TYPE_CHECKING
from typing import Any, Set, List, Dict, Type, Tuple, Mapping
from typing import Union, TypeVar, Optional, Iterable, Callable, Awaitable, Generic
from typing import Any, Dict, Union, Optional, Callable, Awaitable, TYPE_CHECKING
# import some modules needed when checking types
if TYPE_CHECKING:
from nonebot.rule import Rule as RuleClass
from nonebot.drivers import BaseDriver, BaseWebSocket
from nonebot.permission import Permission as PermissionClass
from nonebot.adapters import BaseBot, BaseEvent, BaseMessage, BaseMessageSegment
from nonebot.matcher import Matcher as MatcherClass
from nonebot.rule import Rule
def overrides(InterfaceClass: object):
@ -42,56 +34,6 @@ def overrides(InterfaceClass: object):
return overrider
Driver = TypeVar("Driver", bound="BaseDriver")
"""
:类型: ``BaseDriver``
:说明:
所有 Driver 的基类
"""
WebSocket = TypeVar("WebSocket", bound="BaseWebSocket")
"""
:类型: ``BaseWebSocket``
:说明:
所有 WebSocket 的基类
"""
Bot = TypeVar("Bot", bound="BaseBot")
"""
:类型: ``BaseBot``
:说明:
所有 Bot 的基类
"""
Event = TypeVar("Event", bound="BaseEvent")
"""
:类型: ``BaseEvent``
:说明:
所有 Event 的基类
"""
Message = TypeVar("Message", bound="BaseMessage")
"""
:类型: ``BaseMessage``
:说明:
所有 Message 的基类
"""
MessageSegment = TypeVar("MessageSegment", bound="BaseMessageSegment")
"""
:类型: ``BaseMessageSegment``
:说明:
所有 MessageSegment 的基类
"""
State = Dict[Any, Any]
"""
:类型: ``Dict[Any, Any]``
@ -134,22 +76,6 @@ RunPostProcessor = Callable[["Matcher", Optional[Exception], Bot, Event, State],
事件响应器运行前预处理函数 RunPostProcessor 类型第二个参数为运行时产生的错误如果存在
"""
Matcher = TypeVar("Matcher", bound="MatcherClass")
"""
:类型: ``Matcher``
:说明:
Matcher 即响应事件的处理类通过 Rule 判断是否响应事件运行 Handler
"""
Rule = TypeVar("Rule", bound="RuleClass")
"""
:类型: ``Rule``
:说明:
Rule 即判断是否响应事件的处理类内部存储 RuleChecker 返回全为 True 则响应事件
"""
RuleChecker = Callable[[Bot, Event, State], Union[bool, Awaitable[bool]]]
"""
:类型: ``Callable[[Bot, Event, State], Union[bool, Awaitable[bool]]]``
@ -158,14 +84,6 @@ RuleChecker = Callable[[Bot, Event, State], Union[bool, Awaitable[bool]]]
RuleChecker 即判断是否响应事件的处理函数
"""
Permission = TypeVar("Permission", bound="PermissionClass")
"""
:类型: ``Permission``
:说明:
Permission 即判断是否响应消息的处理类内部存储 PermissionChecker 返回只要有一个 True 则响应消息
"""
PermissionChecker = Callable[[Bot, Event], Union[bool, Awaitable[bool]]]
"""
:类型: ``Callable[[Bot, Event], Union[bool, Awaitable[bool]]]``

View File

@ -1,14 +1,15 @@
import asyncio
from nonebot import on_message
from nonebot.typing import State
from nonebot.permission import USER
from nonebot.typing import Bot, Event
from nonebot.adapters import Bot, Event
a = on_message(priority=0, permission=USER(123123123), temp=True)
@a.handle()
async def test_a(bot: Bot, event: Event, state: dict):
async def test_a(bot: Bot, event: Event, state: State):
print("======== A Received ========")
print("======== A Running Completed ========")
@ -17,7 +18,7 @@ b = on_message(priority=0, permission=USER(123456789), temp=True)
@b.handle()
async def test_b(bot: Bot, event: Event, state: dict):
async def test_b(bot: Bot, event: Event, state: State):
print("======== B Received ========")
await asyncio.sleep(10)
print("======== B Running Completed ========")
@ -27,5 +28,5 @@ c = on_message(priority=0, permission=USER(1111111111))
@c.handle()
async def test_c(bot: Bot, event: Event, state: dict):
async def test_c(bot: Bot, event: Event, state: State):
print("======== C Received ========")

View File

@ -1,4 +1,5 @@
from nonebot.typing import Bot, Event
from nonebot.typing import State
from nonebot.adapters import Bot, Event
from nonebot.permission import GROUP_OWNER
from . import cmd
@ -7,5 +8,5 @@ test_1 = cmd.command("1", aliases={"test"}, permission=GROUP_OWNER)
@test_1.handle()
async def test1(bot: Bot, event: Event, state: dict):
async def test1(bot: Bot, event: Event, state: State):
await test_1.finish(event.raw_message)

View File

@ -1,9 +1,10 @@
from nonebot.typing import Bot, Event
from nonebot.typing import State
from nonebot.adapters import Bot, Event
from . import match
async def heartbeat(bot: Bot, event: Event, state: dict) -> bool:
async def heartbeat(bot: Bot, event: Event, state: State) -> bool:
return event.detail_type == "heartbeat"
@ -11,5 +12,5 @@ test = match.on_metaevent(rule=heartbeat)
@test.receive()
async def handle_heartbeat(bot: Bot, event: Event, state: dict):
async def handle_heartbeat(bot: Bot, event: Event, state: State):
print("[i] Heartbeat")

View File

@ -1,8 +1,9 @@
from nonebot.typing import Bot, Event
from nonebot.typing import State
from nonebot.adapters import Bot, Event
from nonebot.plugin import on_metaevent
async def heartbeat(bot: Bot, event: Event, state: dict) -> bool:
async def heartbeat(bot: Bot, event: Event, state: State) -> bool:
return event.detail_type == "heartbeat"

View File

@ -1,13 +1,13 @@
from nonebot.rule import to_me
from nonebot.typing import Event
from nonebot.typing import State
from nonebot.plugin import on_command
from nonebot.adapters.cqhttp import Bot
from nonebot.adapters.cqhttp import Bot, Event
test_command = on_command("帮助", to_me())
@test_command.handle()
async def test_handler(bot: Bot, event: Event, state: dict):
async def test_handler(bot: Bot, event: Event, state: State):
args = str(event.message).strip()
print("[!] Command:", state["_prefix"], "Args:", args)
if args:
@ -17,7 +17,7 @@ async def test_handler(bot: Bot, event: Event, state: dict):
@test_command.got("help", prompt="你要帮助的命令是?")
async def test_handler(bot: Bot, event: Event, state: dict):
async def test_handler(bot: Bot, event: Event, state: State):
print("[!] Command 帮助:", state["help"])
if state["help"] not in ["test1", "test2"]:
await test_command.reject(f"{state['help']} 不支持,请重新输入!")

View File

@ -1,18 +1,18 @@
from nonebot.rule import to_me
from nonebot.typing import Event
from nonebot.typing import State
from nonebot.plugin import on_startswith
from nonebot.adapters.cqhttp import Bot
from nonebot.adapters.ding import Bot as DingBot, Event as DingEvent
from nonebot.permission import GROUP_ADMIN
from nonebot.adapters.ding import Bot as DingBot, Event as DingEvent
from nonebot.adapters.cqhttp import Bot as CQHTTPBot, Event as CQHTTPEvent
test_command = on_startswith("hello", to_me(), permission=GROUP_ADMIN)
@test_command.handle()
async def test_handler(bot: Bot, event: Event, state: dict):
async def test_handler(bot: CQHTTPBot, event: CQHTTPEvent, state: State):
await test_command.finish("cqhttp hello")
@test_command.handle()
async def test_handler(bot: DingBot, event: DingEvent, state: dict):
async def test_handler(bot: DingBot, event: DingEvent, state: State):
await test_command.finish("ding hello")

View File

@ -1,13 +1,15 @@
from nonebot.typing import Bot, Event, Matcher
from nonebot.typing import State
from nonebot.matcher import Matcher
from nonebot.adapters import Bot, Event
from nonebot.message import event_preprocessor, run_preprocessor
@event_preprocessor
async def handle(bot: Bot, event: Event, state: dict):
async def handle(bot: Bot, event: Event, state: State):
state["preprocessed"] = True
print(event)
@run_preprocessor
async def run(matcher: Matcher, bot: Bot, event: Event, state: dict):
async def run(matcher: Matcher, bot: Bot, event: Event, state: State):
print(matcher)

View File

@ -1,12 +1,13 @@
from nonebot import on_command
from nonebot.rule import to_me
from nonebot.typing import Bot, Event
from nonebot.typing import State
from nonebot.adapters import Bot, Event
weather = on_command("天气", rule=to_me(), priority=1)
@weather.handle()
async def handle_first_receive(bot: Bot, event: Event, state: dict):
async def handle_first_receive(bot: Bot, event: Event, state: State):
args = str(event.message).strip() # 首次发送命令时跟随的参数,例:/天气 上海则args为上海
print(f"==={args}===")
if args:
@ -14,7 +15,7 @@ async def handle_first_receive(bot: Bot, event: Event, state: dict):
@weather.got("city", prompt="你想查询哪个城市的天气呢?")
async def handle_city(bot: Bot, event: Event, state: dict):
async def handle_city(bot: Bot, event: Event, state: State):
city = state["city"]
if city not in ["上海", "北京"]:
await weather.reject("你想查询的城市暂不支持,请重新输入!")