关于类型检查:如何检查python中当前有效的类型

How to check currently valid types in Python

背景: 从两个migrating Python与numpy / SciPy。想做一个有用的小模块的功能。特别是,我想创建一个递归元素类型检查。

问题: 它是可能得到一个list of the current有效的Python环境类型的函数被称为冰?

例如,isinstance(1,int)True会回来的,isinstance(1,str)False会回来的,但isinstance(1,asdf)会把一个int和NameError: name 'asdf' is not defined即是定义,但asdf冰槽。如何能在把列表类型,都是定义的名称,或在指尖流Python环境,他们的城市和滤波器的类型?


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

1
2
3
4
type('hello') == str
type(5) == int
type(int) == type
type(type) == type

都是True

为此,请查找作用域中指向type类型对象的所有变量。

要使所有对象都处于作用域中,请查看both dir()(不包括诸如intdir(__builtins__)等内置名称)和dir(__builtins__)(the built-in-names)->del>locals()(variables defined in the current function)、globals()(variables defined outside of functions in the current module)和vars(__builtins__)(内置名称)。这些都是来自name=>object的字典,因此将它们组合起来并获取对象:

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

并且只过滤类型:

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

注意,这些只是作用域中指向类型的变量。可以引用一个对象,该对象的类型没有分配给作用域中的任何变量。例如:

1
2
3
4
5
def foo():
    class Foo:
        pass
    return Foo()
x = foo()


也许你可以查一下types模块?请参阅以下文档:http://docs.python.org/library/types.html。你也可以在你的程序中得到当前的变量,比如:

1
2
3
4
5
6
In [9]: def spam():
            x=5
            y=6

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

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