Python中的解析方法变量名称?

时间:2011-05-12 18:14:55

标签: 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 

如何提取方法names中所有变量的typesMyPythonMethod

理想情况下,我希望获得所有变量名称及其类型的方法名称。例如,方法MyPythonMethod的输出将如下所示:

varNames = ["a", "myValue", "listValues", "i"]

varTypes = ["int", "float", "list", "float"]

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

1变量在python中没有类型。对象具有类型,变量指向对象。

[2]您可以使用inspect module获取有关函数内部的信息。    阅读文档 - 他们会告诉您可以检查的内容。   例如,MyPythonMethod.func_code.co_varnames将为您提供本地变量名称。   (请注意,MyPythonMethod,如定义的,实际上是一个函数,而不是一个方法。)

[3]但即使你得到局部变量的名字,它也不会绑定到任何对象  除了函数正在执行。值4绑定到函数中的局部变量'a' - 在调用函数之前和之后,没有'a'并且它没有绑定到任何东西。

[4]如果在调试器中运行该函数,则可以在任何时候停止执行并检查函数中创建的变量和对象。

[5]如果函数引发异常,您可以捕获异常并在异常时访问函数的某些状态。

答案 1 :(得分:4)

你不能“从外面”这样做。

  • 在方法运行之前,本地变量不存在。虽然所有变量的范围都是静态知道的,即在编译时,我认为如果不自己爬过AST或字节码,你不能轻易获得这些信息。 (编辑:史蒂文证明我错了这个...代码对象有一个包含所有局部变量名的元组)
  • 给定的代码块不能访问任何作用域,而是它自己的和周围的“词法”作用域(内置函数,模块级全局变量,封闭函数的局部作用域)。
  • 没有变量类型(在Python中) - 任何变量都可以在其生命周期内引用任何数量的完全不同类型的对象。如果添加a = "foo",输出应该是什么?然后,如果您添加a = SomeClass()

在方法本身内部,可以使用locals()来获取本地变量及其当前引用的对象的字典,并且可以继续在值(对象)上调用type。当然,这只会使您获得当前引用的对象的类型。正如评论中暗示的那样,我怀疑这是否有用。你真正想做什么,即你想解决什么问题?

答案 2 :(得分:0)

如果您使用pdb,则无法将最后一行设置为断点,然后请求调试器查看顶部堆栈帧并为您列出变量?或者你可以查看pdb代码并复制它的技巧,了解如何引入断点,然后检查你注册的断点函数下面的堆栈框架。