Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions py_backwards/transformers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -27,6 +28,7 @@
YieldFromTransformer,
ReturnFromGeneratorTransformer,
# 2.7
KeywordOnlyArgumentsTransformer,
FunctionsAnnotationsTransformer,
SuperWithoutArgumentsTransformer,
ClassWithoutBasesTransformer,
Expand Down
37 changes: 37 additions & 0 deletions py_backwards/transformers/keyword_only_arguments.py
Original file line number Diff line number Diff line change
@@ -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)