[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Referring to a module by a string without using eval()

Peter Otten <__peter__ at web.de> schrieb am Mi., 17. Mai 2017 um 09:31 Uhr:

> jeanbigboute at gmail.com wrote:
> > I am trying to write some recursive code to explore the methods, classes,
> > functions, builtins, etc. of a package all the way down the hierarchy.
> > 2) I ultimately need to create inputs to explore_pkg programmatically en
> > route to a recursively called function.  The only way I can think of is
> to
> > use strings.  But, passing a string such as 'np.random' into explore_pkg
> > correctly returns the methods/... associated with the string and not the
> > module np.random
> >
> > e.g. explore_pkg('np.random') will NOT do what I want
> >
> > explore_pkg(eval('np.random')) does work but I understand eval is
> > dangerous and not to be trifled with.

with a Class you can do it also.

import os

class Module:
    def __init__(self, module):
        self._name = module.__name__
        print('Got module', self._name)
        self._file = module.__file__ if hasattr(module, '__file__') else
        self._module = module
    def __repr__(self):
        return "<module '{}' from '{}'>".format(self._name, self._file)
    def __getattr__(self, key):
        ret = getattr(self._module, key)
        if isinstance(ret, types.ModuleType):
            print('Attribute {} is in the module {}'.format(key,
            return Module(ret)
            print('Attribute {} is not a module. It\'s a {}'.format(key,
            return ret
    def __getitem__(self, key):
        return self.__getattr__(key)

os_wrapped = Module(os)

sub1 = 'path'
sub2 = 'sys'
sub3 = 'version'

value = os_wrapped[sub1][sub2][sub3]

Maybe this code breaks other stuff. Also error handling is not present.

Greetings Andre