diff --git a/py_backwards/transformers/__init__.py b/py_backwards/transformers/__init__.py index 82efa61..bcc4060 100644 --- a/py_backwards/transformers/__init__.py +++ b/py_backwards/transformers/__init__.py @@ -2,6 +2,7 @@ from .dict_unpacking import DictUnpackingTransformer from .formatted_values import FormattedValuesTransformer from .functions_annotations import FunctionsAnnotationsTransformer +from .keyword_only_arguments import KeywordOnlyArgumentsTransformer from .starred_unpacking import StarredUnpackingTransformer from .variables_annotations import VariablesAnnotationsTransformer from .yield_from import YieldFromTransformer @@ -27,6 +28,7 @@ YieldFromTransformer, ReturnFromGeneratorTransformer, # 2.7 + KeywordOnlyArgumentsTransformer, FunctionsAnnotationsTransformer, SuperWithoutArgumentsTransformer, ClassWithoutBasesTransformer, diff --git a/py_backwards/transformers/keyword_only_arguments.py b/py_backwards/transformers/keyword_only_arguments.py new file mode 100644 index 0000000..7990217 --- /dev/null +++ b/py_backwards/transformers/keyword_only_arguments.py @@ -0,0 +1,37 @@ +from .base import BaseNodeTransformer + + +class KeywordOnlyArgumentsTransformer(BaseNodeTransformer): + """Compiles: + def fn(x, *, a=None): + pass + To: + def fn(x, a=None): + pass + + """ + target = (2, 7) + + def visit_arguments(self, node): + if node.kwonlyargs: + self._tree_changed = True + + if node.defaults: + required_args = node.args[:-len(node.defaults)] + optional_args = node.args[-len(node.defaults):] + else: + required_args = node.args + optional_args = [] + + for kwarg, default in zip(node.kwonlyargs, node.kw_defaults): + if default is None: + required_args.append(kwarg) + else: + optional_args.append(kwarg) + node.defaults.append(default) + + node.args = required_args + optional_args + node.kwonlyargs = [] + node.kw_defaults = [] + + return self.generic_visit(node)