Guest User

Untitled

a guest
Sep 19th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.18 KB | None | 0 0
  1. import inspect
  2. from collections import Callable
  3. from typing import (TypeVar,
  4. Union)
  5.  
  6. Domain = TypeVar('Domain')
  7. Range = TypeVar('Range')
  8.  
  9.  
  10. class Curry:
  11. def __init__(self, function: Callable[..., Range],
  12. *args: Domain, **kwargs: Domain) -> None:
  13. self.function = function
  14. self.args = args
  15. self.kwargs = kwargs
  16.  
  17. @property
  18. def signature(self) -> inspect.Signature:
  19. return inspect.signature(self.function)
  20.  
  21. def __call__(self, *args: Domain, **kwargs: Domain
  22. ) -> Union['Curry', Range]:
  23. args = self.args + args
  24. kwargs_collision = self.kwargs.keys() & kwargs.keys()
  25. if kwargs_collision:
  26. raise ValueError('Next keyword arguments conflicts '
  27. 'with previously curried ones: {names}.'
  28. .format(names=', '.join(kwargs_collision)))
  29. kwargs = {**self.kwargs, **kwargs}
  30. if len(args) + len(kwargs) < len(self.signature.parameters):
  31. return Curry(self.function, *args, **kwargs)
  32. return self.function(*args, **kwargs)
  33.  
  34.  
  35. def curry(function: Callable[..., Range]) -> Curry:
  36. return Curry(function)
Add Comment
Please, Sign In to add comment