Skip to content

Add the well-loved pipe operation #49

Description

@spapas

You may want to add a pipe operator to have things like

square = lambda x: x ** 2

2 | square  | (lambda x: x+1) | print 

(this will output 5)

A naive implementation could be:

class PipeWrapper(ast.NodeTransformer):
    def visit_BinOp(self, node):
        if isinstance(node.op, ast.BitOr):
            node.left = self.visit(node.left)
            node.right = self.visit(node.right)

            return ast.Call(
                func=node.right,
                args=[node.left],
                keywords=[],
            )
        return self.generic_visit(node)


def transform_ast(tree, **_kwargs):
    """Transforms the Abstract Syntax Tree or a single node"""
    tree_or_node = PipeWrapper().visit(tree)
    ast.fix_missing_locations(tree_or_node)
    return tree_or_node

def add_hook(**_kwargs):
    """Creates and automatically adds the import hook in sys.meta_path"""
    hook = import_hook.create_hook(
        # transform_source=transform_source,
        transform_ast=transform_ast,
        hook_name=__name__,  # optional
    )
    return hook

This needs improvement to identify if the pipe operator or the binary or operator is needed, right now 1 | 2 throws error.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions