Last active
June 16, 2017 02:19
-
-
Save MatMercer/c60d8e343170d4a1146383f284b8f647 to your computer and use it in GitHub Desktop.
Returns a dictionary with all functions closure levels inside a class.
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
""" | |
Recipe by Mateus Mercer ~ [email protected] | |
This code is released with the MIT license, if you | |
didn't got a copy, get a copy at https://opensource.org/licenses/MIT | |
12/2016 | |
""" | |
class DictClosured: | |
def as_dict(self) -> dict: | |
""" | |
Returns a dictionary with all functions closure levels inside a class. | |
eg: | |
class z(DictClosured): | |
def x(self): | |
def y(self): | |
return "I'm here" | |
return y | |
inst = z() | |
inst.as_dict() will return a dictionary in a "json way" with the content as follows | |
{ | |
"x": | |
{ | |
"Y": "I'm here" | |
} | |
} | |
""" | |
d = {} | |
# Avoid protected funtions | |
valid_functions = [ | |
getattr(self, attr) | |
for attr in dir(self) | |
if not attr.startswith("_") | |
and attr is not "as_dict" | |
] | |
# Avoid attributtes | |
valid_functions = [attr for attr in valid_functions if callable(attr)] | |
for func in valid_functions: | |
self._recursive_closure(d, func) | |
return d | |
@staticmethod | |
def _is_callable_list(funcs: list) -> bool: | |
""" | |
Checks if ALL the members of a list are callable and returns true or false. | |
""" | |
for func in funcs: | |
if not callable(func): | |
return False | |
return True | |
def _recursive_closure(self, dicto, func: callable): | |
""" | |
The primary function of this class finds all the function and | |
organize them in a dictionary inluding closure levels. | |
""" | |
try: | |
fname = func.__name__ | |
except AttributeError: | |
fname = "!NO NAME!" | |
data = None | |
try: | |
try: | |
data = func() | |
except TypeError: | |
data = func(self) | |
except Exception as e: | |
data = None | |
finally: | |
dicto[fname] = data | |
if type(data) is list and self._is_callable_list(data): | |
dicto[fname] = {} | |
for tfunc in data: | |
self._recursive_closure(dicto[fname], tfunc) | |
return dicto |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment