Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import inspect
- from collections import Callable
- from typing import (TypeVar,
- Union)
- Domain = TypeVar('Domain')
- Range = TypeVar('Range')
- class Curry:
- def __init__(self, function: Callable[..., Range],
- *args: Domain, **kwargs: Domain) -> None:
- self.function = function
- self.args = args
- self.kwargs = kwargs
- @property
- def signature(self) -> inspect.Signature:
- return inspect.signature(self.function)
- def __call__(self, *args: Domain, **kwargs: Domain
- ) -> Union['Curry', Range]:
- args = self.args + args
- kwargs_collision = self.kwargs.keys() & kwargs.keys()
- if kwargs_collision:
- raise ValueError('Next keyword arguments conflicts '
- 'with previously curried ones: {names}.'
- .format(names=', '.join(kwargs_collision)))
- kwargs = {**self.kwargs, **kwargs}
- if len(args) + len(kwargs) < len(self.signature.parameters):
- return Curry(self.function, *args, **kwargs)
- return self.function(*args, **kwargs)
- def curry(function: Callable[..., Range]) -> Curry:
- return Curry(function)
Add Comment
Please, Sign In to add comment