+1

On Wed, Jun 10, 2009 at 9:20 AM, Fabian Pedregosa<fab...@fseoane.net> wrote:
>
> From: Fabian Seoane <fab...@fseoane.net>
>
> Function get_class returns a class from a given string. It makes use
> of get_mod_func
>
> Implemented after a function with same name in django's codebase
> ---
>  sympy/utilities/source.py            |   30 ++++++++++++++++++++++++++++++
>  sympy/utilities/tests/test_source.py |    8 ++++++++
>  2 files changed, 38 insertions(+), 0 deletions(-)
>  create mode 100644 sympy/utilities/tests/test_source.py
>
> diff --git a/sympy/utilities/source.py b/sympy/utilities/source.py
> index 56ca7f7..213d3d8 100644
> --- a/sympy/utilities/source.py
> +++ b/sympy/utilities/source.py
> @@ -10,3 +10,33 @@ def source(object):
>     """
>     print 'In file: %s' % inspect.getsourcefile(object)
>     print inspect.getsource(object)
> +
> +def get_class(lookup_view):
> +    """
> +    Convert a string version of a class name to the object.
> +
> +    For example, get_class('sympy.core.Basic') will return
> +    class Basic located in module sympy.core
> +    """
> +    if isinstance(lookup_view, str):
> +        # Bail early for non-ASCII strings (they can't be functions).
> +        lookup_view = lookup_view.encode('ascii')
> +        mod_name, func_name = get_mod_func(lookup_view)
> +        if func_name != '':
> +            lookup_view = getattr(__import__(mod_name, {}, {}, ['']), 
> func_name)
> +            if not callable(lookup_view):
> +                raise AttributeError("'%s.%s' is not a callable." % 
> (mod_name, func_name))
> +    return lookup_view
> +
> +def get_mod_func(callback):
> +    """
> +    splits the string path to a class into a string path to the module
> +    and the name of the class. For example:
> +        >>> get_mod_func('sympy.core.basic.Basic')
> +        ('sympy.core.basic', 'Basic')
> +    """
> +    try:
> +        dot = callback.rindex('.')
> +    except ValueError:
> +        return callback, ''
> +    return callback[:dot], callback[dot+1:]
> \ No newline at end of file
> diff --git a/sympy/utilities/tests/test_source.py 
> b/sympy/utilities/tests/test_source.py
> new file mode 100644
> index 0000000..0716d46
> --- /dev/null
> +++ b/sympy/utilities/tests/test_source.py
> @@ -0,0 +1,8 @@
> +from sympy.utilities.source import get_mod_func, get_class
> +
> +def test_get_mod_func():
> +    assert get_mod_func('sympy.core.basic.Basic') == ('sympy.core.basic', 
> 'Basic')
> +
> +def test_get_class():
> +    _basic = get_class('sympy.core.basic.Basic')
> +    assert _basic.__name__ == 'Basic'
> \ No newline at end of file
> --
> 1.6.1.2
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sympy-patches" group.
To post to this group, send email to sympy-patches@googlegroups.com
To unsubscribe from this group, send email to 
sympy-patches+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sympy-patches?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to