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的duck类型。
- 你到底想做什么?是的,我读了recursive element type checker。
在Python中,类型本身就是普通对象。例如,
1 2 3 4
| type('hello') == str
type(5) == int
type(int) == type
type(type) == type |
都是True。
为此,请查找作用域中指向type类型对象的所有变量。
要使所有对象都处于作用域中,请查看both dir()(不包括诸如int和dir(__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() |
- 谢谢,但似乎不起作用。/print[type(o)for o in objs]返回所有类型str。因此,在_scope中的类型_返回为空。
- @哦。我忘了dict()只是返回名称,而不是实际对象。固定在编辑中。
- 谢谢,但是stackoverflow.com/a/39858/1077083显然**是个坏主意,它不适用于python 3、jpython或非2.x cpython。相反,我做了objs=builtins.uudict_uuuobjs.update(globals())objs.update(locals())并且它工作了!所以谢谢你!我开了支票:)不过,你还是想为将来的用户编辑你的答案…
- @Whearyou:只有当键不是字符串时才有。但是这里的键保证是字符串,因为它们是变量名。
也许你可以查一下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') |
希望它有帮助,你可以开始。对不起,如果我完全偏离了轨道。
- 对于types模块,我会+1,但不知道为什么要包含黑客代码来获取变量名,这不是问题的一部分。
- op:"如何获取定义的类型列表,或当前Python环境中存在的名称"…我认为这可能有助于OP获取当前Python环境中的名称列表。
- 当前环境中的名称为locals()或globals()。
- @amit"从python 2.2开始,内置的工厂函数(如int()和str())也是相应类型的名称。现在,这是访问类型而不是使用类型模块的首选方法。"
- @jamylak locals()和globals()似乎不返回所有名称,因为它不返回int或str