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

如何在Python中检查当前有效的类型,python,typechecking,Python,Typechecking,背景: 使用numpy/scipy从R迁移到Python。尝试制作一个有用函数的小模块。特别是,我正在尝试创建一个递归元素类型检查器 问题: 是否可以在调用函数的Python环境中获取当前有效类型的列表 例如,isinstance(1,int)将返回True,isinstance(1,str)将返回False,但isinstance(1,asdf)将抛出名称错误:未定义名称“asdf”,即定义了int和str,但未定义asdf。如何获取已定义的类型列表或当前Python环境中存在的名称,并按类型

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

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


例如,
isinstance(1,int)
将返回
True
isinstance(1,str)
将返回
False
,但
isinstance(1,asdf)
将抛出
名称错误:未定义名称“asdf”
,即定义了int和str,但未定义asdf。如何获取已定义的类型列表或当前Python环境中存在的名称,并按类型进行筛选?

也许您可以查找
类型模块?请参阅此处的文档:。您还可以在程序中获取当前变量,如下所示:

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

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

希望这有帮助,你可以开始。抱歉,如果我完全偏离了轨道。

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

type('hello') == str
type(5) == int
type(int) == type
type(type) == type
都是
真的

因此,要执行此操作,请查找范围中指向类型为
的对象的所有变量

,查看
dir()
(不包括内置名称,如
int
)和
dir(
builtins)
(内置名称)
locals()
(在当前函数中定义的变量)、
globals()
(在当前模块中的函数外部定义的变量)和
vars(
builtins)
(内置名称)。这些都是来自name=>object的字典,所以将它们组合起来,得到对象:

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()

不相关,但这有点违背Python的duck类型。您实际上想做什么?是的,我读了
递归元素类型检查器
。我想+1表示
类型
模块,但不确定为什么要包含hacky代码来获取变量名,这不是问题的一部分。Op:“如何获取已定义的类型列表或当前python环境中的名称”。。我认为这可能有助于OP获取当前python环境中的名称列表。当前环境中的名称应为
locals()
globals()
@Amit”从Python 2.2开始,int()和str()等内置工厂函数也是相应类型的名称。现在,这是访问该类型而不是使用类型模块的首选方法。“@jamylak locals()和globals()似乎不会返回所有名称,因为它不会返回int或strhanks,但似乎不起作用:/print[type(o) for o in objs]返回所有类型str。因此,返回\u范围中的类型\uempty@whearyou:哎呀,我忘了
dict()
只返回名称,而不是实际的对象。已在edit中修复。谢谢,但显然**是个坏主意,它不适用于Python 3、JPython或非2.x CPython。相反,我使用了objs=builtins。objs.update(globals())objs.update(locals())并且有效!谢谢!我检查:)你想为将来的用户编辑你的答案,但是…@whearyou:这只是在键不是字符串的情况下。但是这里的键保证是字符串,因为它们是变量名。