Created
March 28, 2023 13:59
-
-
Save Silva97/29214fbb2ee8afe48a91b0246531c7b1 to your computer and use it in GitHub Desktop.
Class to create a wrapper to pipe function calls.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import inspect | |
class Pipe: | |
""" | |
Create a wrapper to pipe function calls with the given value. | |
The functions could be: value's method, builtin or any | |
function in the current module. | |
Examples: | |
print(254 | Pipe() | hex | str.upper) | |
print(Pipe(254) | hex | str.upper) | |
print((254 | Pipe() | hex).upper()) | |
print(Pipe(254).hex().upper()) | |
Author: Luiz Felipe Silva (https://github.com/Silva97) | |
""" | |
__value = None | |
__withAttribute = None | |
def __init__(self, value=None, withAttribute: str = None): | |
self.__value = value | |
self.__withAttribute = withAttribute | |
def unpipe(self): | |
""" Get the raw value without the Pipe wrapper """ | |
if self.__withAttribute != None: | |
return getattr(self.__value, self.__withAttribute) | |
return self.__value | |
def __getattr__(self, name): | |
self.__withAttribute = name | |
return self | |
def __call__(self, *args): | |
function = self.__withAttribute | |
self.__withAttribute = None | |
if hasattr(self.__value, function): | |
self.__value = getattr(self.__value, function)(*args) | |
return self | |
builtinModule = __import__('builtins') | |
if hasattr(builtinModule, function): | |
function = getattr(builtinModule, function) | |
self.__value = function(self.__value, *args) | |
return self | |
callerModuleName = inspect.currentframe().f_back.f_globals.get('__name__') | |
callerModule = __import__(callerModuleName) | |
if hasattr(callerModule, function): | |
function = getattr(callerModule, function) | |
self.__value = function(self.__value, *args) | |
return self | |
raise Exception( | |
f"Function '{function}' could not be found.") | |
def __ror__(self, value): | |
self.__value = value | |
return self | |
def __or__(self, function): | |
self.__value = function(self.__value) | |
return self | |
def __bool__(self): | |
return bool(self.unpipe()) | |
def __int__(self): | |
return int(self.unpipe()) | |
def __float__(self): | |
return float(self.unpipe()) | |
def __str__(self): | |
return str(self.unpipe()) | |
def __bytes__(self): | |
return bytes(self.unpipe()) | |
def __hash__(self): | |
return hash(self.unpipe()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment