Source code for pycharmers.utils.inspect_utils

# coding: utf-8
"""

TODO:
    Translate from "module name" to "package name". 
"""

import re
import inspect
import pathlib
from collections import defaultdict

from .generic_utils import str_strip, flatten_dual

[docs]def get_defined_members(obj, predicate=lambda x: inspect.isfunction(x) or inspect.isclass(x)): """Get only defined members. Args: obj (object) : module. predicate (callable) : Only return members that satisfy a given ``predicate`` . Returns: dict : ``{"member name" : "member object"}`` Examples: >>> from pycharmers.utils import inspect_utils, get_defined_members >>> get_defined_members(inspect_utils) { 'get_defined_members': <function pycharmers.utils.inspect_utils.get_defined_members(obj, predicate=<function <lambda> at 0x14227fca0>)>, 'get_imported_members': <function pycharmers.utils.inspect_utils.get_imported_members(obj)> } """ imported_members = flatten_dual(get_imported_members(obj).values()) return {name:member for name,member in inspect.getmembers(obj, predicate=predicate) if name not in imported_members}
[docs]def get_imported_members(obj): """Get import members. Args: obj (str/object) : module or path to files. Returns dict : ``{ "module" : ["import members"]}`` Examples: >>> from pycharmers.utils import inspect_utils, get_imported_members, dumps_json >>> print(dumps_json(obj=get_imported_members(inspect_utils))) { "": [ "re", "inspect" ], "collections": [ "defaultdict" ], ".generic_utils": [ "str_strip", "flatten_dual" ] } """ if isinstance(obj, pathlib.PosixPath): obj = str(obj) elif not isinstance(obj, str): obj = inspect.getfile(obj) with open(obj, mode="r") as f: file_contents = "".join(f.readlines()) imported_members = defaultdict(list) for m,v_wb,v_nb in re.findall(pattern=r"(?:^|(?<=\n))(?:from\s+(.+?)\s+)?import\s+(?:\(((?:.|\s)*?)\)|((?:(?<!\()(?:.|\s))*?))\n", string=file_contents): imported_members[m].extend([str_strip(v) for v in (v_wb + v_nb).split(" as ")[0].split(",")]) return imported_members