如何在Python中检查当前有效的类型

时间:2012-08-04 07:08:01

标签: python typechecking

背景: 使用numpy / scipy从R迁移到Python。试图制作一个有用功能的小模块。特别是,我正在尝试创建一个递归元素类型检查器。

问题: 是否可以在Python环境中获取当前有效类型的列表?

例如,isinstance(1,int)将返回Trueisinstance(1,str)将返回False,但isinstance(1,asdf)将返回NameError: name 'asdf' is not defined,即int和str已定义,但asdf不是。如何获取已定义的类型列表或当前Python环境中的名称,并按类型过滤它们?

2 个答案:

答案 0 :(得分:2)

在Python中,类型本身就是普通对象。也就是说,例如,

type('hello') == str
type(5) == int
type(int) == type
type(type) == type

都是True

为此,请查找范围内指向type类型的对象的所有变量。

To get all objects in scope,请查看两个dir()(不包括内置名称,如int)和dir(__builtins__)(内置名称) locals()(在当前函数中定义的变量),globals()(在当前模块中的函数之外定义的变量)和vars(__builtins__)(内置名称)。这些都是来自name =>的字典。对象,所以将它们组合起来并获取对象:

objs = dict(vars(__builtins__), **dict(globals(), **locals())).values()

并仅过滤类型:

types_in_scope = [o for o in objs if isinstance(o, type)]

请注意,这些只是范围中指向类型的变量。很可能引用一个对象,该对象的类型未分配给作用域中的任何变量。例如:

def foo():
    class Foo:
        pass
    return Foo()
x = foo()

答案 1 :(得分:0)

也许你可以查看types模块?请参阅此处的文档:http://docs.python.org/library/types.html。您也可以在程序中获取当前变量,如下所示:

In [9]: def spam():
            x=5
            y=6

In [10]: spam.func_code.co_varnames
Out[10]: ('x', 'y')

希望它有所帮助,您可以开始使用。对不起,如果我完全偏离了轨道。