mirror of
				https://github.com/Rapptz/discord.py.git
				synced 2025-10-25 10:32:59 +00:00 
			
		
		
		
	[commands] Allow converters to be instantiated.
This allows for you to create converters that can have varying behaviour using the converter's __init__ instead of having to do a meta-class based approach to get around the fact that __init__ is part of the interface. To make up for the lack of __init__, a new method Converter.prepare was added to do the work that __init__ used to do.
This commit is contained in:
		| @@ -54,6 +54,9 @@ class Converter: | ||||
|     to do its conversion logic. This method could be a coroutine or a regular | ||||
|     function. | ||||
|  | ||||
|     Before the convert method is called, :meth:`prepare` is called. This | ||||
|     method must set the attributes below if overwritten. | ||||
|  | ||||
|     Attributes | ||||
|     ----------- | ||||
|     ctx: :class:`Context` | ||||
| @@ -61,7 +64,7 @@ class Converter: | ||||
|     argument: str | ||||
|         The argument that is being converted. | ||||
|     """ | ||||
|     def __init__(self, ctx, argument): | ||||
|     def prepare(self, ctx, argument): | ||||
|         self.ctx = ctx | ||||
|         self.argument = argument | ||||
|  | ||||
| @@ -69,8 +72,7 @@ class Converter: | ||||
|         raise NotImplementedError('Derived classes need to implement this.') | ||||
|  | ||||
| class IDConverter(Converter): | ||||
|     def __init__(self, ctx, argument): | ||||
|         super().__init__(ctx, argument) | ||||
|     def __init__(self): | ||||
|         self._id_regex = re.compile(r'([0-9]{15,21})$') | ||||
|  | ||||
|     def _get_id_match(self): | ||||
|   | ||||
| @@ -203,11 +203,15 @@ class Command: | ||||
|             converter = getattr(converters, converter.__name__ + 'Converter') | ||||
|  | ||||
|         if inspect.isclass(converter) and issubclass(converter, converters.Converter): | ||||
|             instance = converter(ctx, argument) | ||||
|             if asyncio.iscoroutinefunction(instance.convert): | ||||
|                 return (yield from instance.convert()) | ||||
|             else: | ||||
|                 return instance.convert() | ||||
|             instance = converter() | ||||
|             instance.prepare(ctx, argument) | ||||
|             ret = yield from discord.utils.maybe_coroutine(instance.convert) | ||||
|             return ret | ||||
|  | ||||
|         if isinstance(converter, converters.Converter): | ||||
|             converter.prepare(ctx, argument) | ||||
|             ret = yield from discord.utils.maybe_coroutine(converter.convert) | ||||
|             return ret | ||||
|  | ||||
|         return converter(argument) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user