diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index 8d2f5ad57..9883447a8 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -333,13 +333,18 @@ class Command: param: The inspect.Parameter to look at. """ arginfo = self.get_arg_info(param) - if param.annotation is not inspect.Parameter.empty: + if arginfo.value: + # Filled values are passed 1:1 + return None + elif param.kind in [inspect.Parameter.VAR_POSITIONAL, + inspect.Parameter.VAR_KEYWORD]: + # For *args/**kwargs we only support strings + assert param.annotation in [inspect.Parameter.empty, str], param + return None + elif param.annotation is not inspect.Parameter.empty: return param.annotation elif param.default not in [None, inspect.Parameter.empty]: return type(param.default) - elif arginfo.value or param.kind in [inspect.Parameter.VAR_POSITIONAL, - inspect.Parameter.VAR_KEYWORD]: - return None else: return str diff --git a/tests/unit/api/test_cmdutils.py b/tests/unit/api/test_cmdutils.py index 5e1389c80..9f01ea7bb 100644 --- a/tests/unit/api/test_cmdutils.py +++ b/tests/unit/api/test_cmdutils.py @@ -154,6 +154,15 @@ class TestRegister: args, kwargs = cmd._get_call_args(win_id=0) fun(*args, **kwargs) + def test_star_args_optional_annotated(self): + @cmdutils.register(star_args_optional=True) + def fun(*args: str): + """Blah.""" + + cmd = objects.commands['fun'] + cmd.namespace = cmd.parser.parse_args([]) + cmd._get_call_args(win_id=0) + @pytest.mark.parametrize('inp, expected', [ (['--arg'], True), (['-a'], True), ([], False)]) def test_flag(self, inp, expected):