如何在Python中检查当前有效的类型
背景: 使用numpy/scipy从R迁移到Python。尝试制作一个有用函数的小模块。特别是,我正在尝试创建一个递归元素类型检查器 问题: 是否可以在调用函数的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环境中存在的名称,并按类型
例如,
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:这只是在键不是字符串的情况下。但是这里的键保证是字符串,因为它们是变量名。