局部作用域类的内省(python)

局部作用域类的内省(python),python,python-2.7,Python,Python 2.7,当我试图通过中的一些建议使用内省从字符串导航到类时,我注意到给定的方法无法在函数的局部作用域中找到类。考虑下面的代码: import sys def f(): class LocalClass: pass print LocalClass print 'LocalClass' in dir(sys.modules[__name__]) 它给出了输出 __main__.LocalClass False 我有点困惑,为什么根据类对象本身,LocalClass似乎

当我试图通过中的一些建议使用内省从字符串导航到类时,我注意到给定的方法无法在函数的局部作用域中找到类。考虑下面的代码:

import sys

def f():
   class LocalClass:
       pass
   print LocalClass
   print 'LocalClass' in dir(sys.modules[__name__])
它给出了输出

__main__.LocalClass
False
我有点困惑,为什么根据类对象本身,LocalClass似乎属于主模块,但无法通过sys.modules访问。有人能解释一下吗


是否有一种方法可以从字符串生成类,即使该类仅在非全局范围内?

在函数
f
中,
LocalClass
确实是本地的。您可以通过尝试
\uuuu main\uuuuu.LocalClass
并看到引发了
AttributeError:'module'对象没有属性'LocalClass'

至于类返回
\uuuuu main\uuuu.LocalClass
的原因,是因为默认情况下,
\uuuuuuu repr\uuuu
函数返回

dir
找不到它的原因是它只查看在其作用域中定义的变量
LocalClass
是本地的,因此如果您查看主模块,它将不会显示

从字符串创建类的方法有很多种

第一个也是最容易理解的方法是使用
exec
。现在,您不应该只使用
exec
来处理随机事件,所以我不建议使用此方法

第二种方法是使用
type
函数。它的帮助页面返回
类型(名称、基数、dict)
。这意味着您可以创建一个名为
LocalClass
的类,子类为
object
,属性
foo
设置为“bar”,方法是执行
type(“LocalClass”),(object,),{foo:“bar”})
并在变量中捕获返回的类。您可以通过执行
globals()[“LocalClass”]=…

PS:获取主模块的一种更简单(不确定是否更漂亮)的方法是执行
import\uuuu main\uuuu
。这可以在任何模块中使用,但我通常建议不要使用它,除非您知道自己在做什么,因为一般来说,python人员不喜欢您做这种事情

编辑:查看链接问题后,您不希望动态创建新类,而是希望检索给定名称的变量。链接问题中的所有答案都可以做到这一点。我让你自己决定你最喜欢哪一个


EDIT2:
LocalClass.\uuuuu模块\uuuu
\uuuu main\uuuu
相同,因为这是您定义类的模块。如果您在模块
Foo
中定义了它,该模块由
\uuuuuu main\uuuuuuu
导入(并且实际上不是独立运行的),您会发现
\uuuuuu module\uuuuu
将是“B”。尽管
LocalClass
是在
\uuuuu main\uuuuu
中定义的,但它不会自动进入全局表,因为它是一个类-在python中,正如您可能已经知道的,(几乎)一切都是一个对象。
dir
函数搜索范围中定义的所有变量。当您在主范围中查看时,它几乎等同于执行
\uuu dict\uuu
globals()
,但有一些细微的区别。因为
LocalClass
是本地的,所以它没有在全局上下文中定义。但是,如果您在函数
f
中执行了
locals()
,您会发现
LocalClass
将出现在该列表中

dir
函数以您使用它的方式返回全局值。Hm。。但是如果同时
dir
告诉我们
LocalClass
不属于主模块,为什么
LocalClass.\uuuuuuu
等于
?至于第二部分——如果问题不清楚,很抱歉,但我并没有试图从字符串中定义本地范围内的新类——而是尝试获取与该字符串对应的classobj实例。