给定一个字符串作为Python函数的用户输入,如果当前定义的命名空间中有一个具有该名称的类,则希望从中获得一个类对象。本质上,我想实现一个函数,它将产生这样的结果:

class Foo:
    pass

str_to_class("Foo")
==> <class __main__.Foo at 0x69ba0>

这有可能吗?


当前回答

您需要类Baz,它位于模块foo.bar中。在Python 2.7中, 你想要使用importlib.import_module(),因为这将使过渡到Python 3更容易:

import importlib

def class_for_name(module_name, class_name):
    # load the module, will raise ImportError if module cannot be loaded
    m = importlib.import_module(module_name)
    # get the class, will raise AttributeError if class cannot be found
    c = getattr(m, class_name)
    return c

使用Python < 2.7:

def class_for_name(module_name, class_name):
    # load the module, will raise ImportError if module cannot be loaded
    m = __import__(module_name, globals(), locals(), class_name)
    # get the class, will raise AttributeError if class cannot be found
    c = getattr(m, class_name)
    return c

Use:

loaded_class = class_for_name('foo.bar', 'Baz')

其他回答

你可以这样做:

globals()[class_name]

使用importlib最适合我。

import importlib

importlib.import_module('accounting.views') 

它使用字符串点表示法来表示你想导入的python模块。

在任意代码执行方面,或者不希望用户传递的名称,您可以有一个可接受的函数/类名称列表,如果输入与列表中的一个匹配,则对其进行计算。

PS:我知道....有点晚了…但这是为将来偶然发现这个的人准备的。

这是可行的:

import sys

def str_to_class(classname):
    return getattr(sys.modules[__name__], classname)

是的,你可以做到。假设你的类存在于全局命名空间中,如下所示:

import types

class Foo:
    pass

def str_to_class(s):
    if s in globals() and isinstance(globals()[s], types.ClassType):
            return globals()[s]
    return None

str_to_class('Foo')

==> <class __main__.Foo at 0x340808cc>