在Python中解析方法变量名?
给定这个Python函数:
def MyPythonMethod(value1, value2):
# defining some variables
a = 4
myValue = 15.65
listValues = [4, 67, 83, -23]
# doing some operation on the list
listValues[0] = listValues[1]
# looping through the values
for i in listValues:
print i
我该如何提取方法 MyPythonMethod
中所有变量的 名称
和 类型
呢?
理想情况下,我想根据方法名称获取所有变量的名称和类型。例如,方法 MyPythonMethod
的输出应该是这样的:
varNames = ["a", "myValue", "listValues", "i"]
varTypes = ["int", "float", "list", "float"]
有什么想法吗?
3 个回答
如果你使用 pdb
,难道不能把最后一行代码设为一个断点,然后让调试器查看最上面的堆栈帧,并列出变量吗?或者你也可以看看 pdb
的代码,学学它是怎么设置断点的,然后检查你注册的断点函数下面的堆栈帧。
你不能从外部做到这一点。
- 局部变量在方法运行之前是不存在的。虽然所有变量的作用域在编译时就已经确定,但我觉得你很难轻易获取这些信息,除非自己去分析抽象语法树(AST)或字节码。(编辑:Steven 让我改变了看法……代码对象有一个元组,里面包含了所有局部变量的名字)
- 一段代码只能访问它自己的作用域以及周围的“词法”作用域(内置函数、模块级全局变量、封闭函数的局部作用域)。
- 在 Python 中,变量没有固定的类型——任何变量在它的生命周期内可以指向任何数量的完全不同类型的对象。如果你先写
a = "foo"
,然后再写a = SomeClass()
,那么输出应该是什么呢?
在方法内部,你可以使用 locals()
来获取一个字典,里面包含了局部变量及其当前指向的对象,然后你可以对这些值(对象)调用 type
。当然,这样只能得到当前指向的对象的类型。正如评论中提到的,我怀疑这有什么用。你真正想做的是什么呢?也就是说,你在解决什么问题?
在Python中,变量没有类型。其实是对象有类型,而变量只是指向这些对象。
你可以使用inspect模块来获取关于你函数内部的信息。看看文档,它们会告诉你可以检查哪些内容。例如,MyPythonMethod.func_code.co_varnames可以给你提供局部变量的名称。(另外要注意,MyPythonMethod实际上是一个函数,而不是方法。)
即使你得到了局部变量的名称,这些变量也只在函数执行时与对象绑定。比如,值4在函数中绑定到局部变量'a'上,但在函数调用之前和之后,'a'并不存在,也没有绑定到任何东西。
如果你在调试器中运行这个函数,你可以在任何时刻暂停执行,检查在函数中创建的变量和对象。
如果函数抛出异常,你可以捕获这个异常,并在异常发生时获取函数的一些状态信息。