背景: 使用numpy / scipy从R迁移到Python。试图制作一个有用功能的小模块。特别是,我正在尝试创建一个递归元素类型检查器。
问题: 是否可以在Python环境中获取当前有效类型的列表?
例如,isinstance(1,int)
将返回True
,isinstance(1,str)
将返回False
,但isinstance(1,asdf)
将返回NameError: name 'asdf' is not defined
,即int和str已定义,但asdf不是。如何获取已定义的类型列表或当前Python环境中的名称,并按类型过滤它们?
答案 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')
希望它有所帮助,您可以开始使用。对不起,如果我完全偏离了轨道。