Allow positional arguments while rendering expressions

This commit is contained in:
Richard Chien 2019-02-01 19:39:09 +08:00
parent 7860c02973
commit 9190b65b6d

View File

@ -63,22 +63,23 @@ async def send(bot: NoneBot, ctx: Context_T,
return None return None
def render_expression(expr: Expression_T, *, def render_expression(expr: Expression_T, *args,
escape_args: bool = True, **kwargs) -> str: escape_args: bool = True, **kwargs) -> str:
""" """
Render an expression to message string. Render an expression to message string.
:param expr: expression to render :param expr: expression to render
:param escape_args: should escape arguments or not :param escape_args: should escape arguments or not
:param args: positional arguments used in str.format()
:param kwargs: keyword arguments used in str.format() :param kwargs: keyword arguments used in str.format()
:return: the rendered message :return: the rendered message
""" """
if isinstance(expr, Callable): if isinstance(expr, Callable):
expr = expr(**kwargs) expr = expr(*args, **kwargs)
elif isinstance(expr, Sequence) and not isinstance(expr, str): elif isinstance(expr, Sequence) and not isinstance(expr, str):
expr = random.choice(expr) expr = random.choice(expr)
if escape_args: if escape_args:
for k, v in kwargs.items(): for k, v in kwargs.items():
if isinstance(v, str): if isinstance(v, str):
kwargs[k] = escape(v) kwargs[k] = escape(v)
return expr.format(**kwargs) return expr.format(*args, **kwargs)