mirror of
				https://github.com/nonebot/nonebot2.git
				synced 2025-10-27 04:56:39 +00:00 
			
		
		
		
	Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Ju4tCode <42488585+yanyongyu@users.noreply.github.com>
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from typing import TYPE_CHECKING, Type, Union, TypeVar, overload
 | |
| 
 | |
| from .abstract import Mixin, Driver
 | |
| 
 | |
| D = TypeVar("D", bound="Driver")
 | |
| 
 | |
| if TYPE_CHECKING:
 | |
| 
 | |
|     class CombinedDriver(Driver, Mixin): ...
 | |
| 
 | |
| 
 | |
| @overload
 | |
| def combine_driver(driver: Type[D]) -> Type[D]: ...
 | |
| 
 | |
| 
 | |
| @overload
 | |
| def combine_driver(driver: Type[D], *mixins: Type[Mixin]) -> Type["CombinedDriver"]: ...
 | |
| 
 | |
| 
 | |
| def combine_driver(
 | |
|     driver: Type[D], *mixins: Type[Mixin]
 | |
| ) -> Union[Type[D], Type["CombinedDriver"]]:
 | |
|     """将一个驱动器和多个混入类合并。"""
 | |
|     # check first
 | |
|     if not issubclass(driver, Driver):
 | |
|         raise TypeError("`driver` must be subclass of Driver")
 | |
|     if not all(issubclass(m, Mixin) for m in mixins):
 | |
|         raise TypeError("`mixins` must be subclass of Mixin")
 | |
| 
 | |
|     if not mixins:
 | |
|         return driver
 | |
| 
 | |
|     def type_(self: "CombinedDriver") -> str:
 | |
|         return (
 | |
|             driver.type.__get__(self)  # type: ignore
 | |
|             + "+"
 | |
|             + "+".join(x.type.__get__(self) for x in mixins)  # type: ignore
 | |
|         )
 | |
| 
 | |
|     return type(
 | |
|         "CombinedDriver", (*mixins, driver), {"type": property(type_)}
 | |
|     )  # type: ignore
 |