From dd25693705b570ef323543e9a8c01a4e03fe1e35 Mon Sep 17 00:00:00 2001 From: Mitar Date: Sat, 16 Sep 2017 18:21:05 -0400 Subject: [PATCH 1/3] Support for converting keyword only arguments. --- py_backwards/transformers/__init__.py | 2 + .../transformers/keyword_only_arguments.py | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 py_backwards/transformers/keyword_only_arguments.py diff --git a/py_backwards/transformers/__init__.py b/py_backwards/transformers/__init__.py index 82efa61..f85bf5d 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 @@ -28,6 +29,7 @@ ReturnFromGeneratorTransformer, # 2.7 FunctionsAnnotationsTransformer, + KeywordOnlyArgumentsTransformer, SuperWithoutArgumentsTransformer, ClassWithoutBasesTransformer, ImportPathlibTransformer, diff --git a/py_backwards/transformers/keyword_only_arguments.py b/py_backwards/transformers/keyword_only_arguments.py new file mode 100644 index 0000000..e705541 --- /dev/null +++ b/py_backwards/transformers/keyword_only_arguments.py @@ -0,0 +1,38 @@ +from typed_ast import ast3 as ast +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) From dc2c963f8f19f4358f41bc03b0b2adfa191d8270 Mon Sep 17 00:00:00 2001 From: Mitar Date: Mon, 25 Sep 2017 03:02:42 -0400 Subject: [PATCH 2/3] Better order of transformers. --- py_backwards/transformers/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py_backwards/transformers/__init__.py b/py_backwards/transformers/__init__.py index f85bf5d..bcc4060 100644 --- a/py_backwards/transformers/__init__.py +++ b/py_backwards/transformers/__init__.py @@ -28,8 +28,8 @@ YieldFromTransformer, ReturnFromGeneratorTransformer, # 2.7 - FunctionsAnnotationsTransformer, KeywordOnlyArgumentsTransformer, + FunctionsAnnotationsTransformer, SuperWithoutArgumentsTransformer, ClassWithoutBasesTransformer, ImportPathlibTransformer, From 12d009de8f08dd2bd15a685a7eb3f9903368fbd3 Mon Sep 17 00:00:00 2001 From: Mitar Date: Mon, 25 Sep 2017 03:04:49 -0400 Subject: [PATCH 3/3] Unnecessary import. --- py_backwards/transformers/keyword_only_arguments.py | 1 - 1 file changed, 1 deletion(-) diff --git a/py_backwards/transformers/keyword_only_arguments.py b/py_backwards/transformers/keyword_only_arguments.py index e705541..7990217 100644 --- a/py_backwards/transformers/keyword_only_arguments.py +++ b/py_backwards/transformers/keyword_only_arguments.py @@ -1,4 +1,3 @@ -from typed_ast import ast3 as ast from .base import BaseNodeTransformer