是否可以检测函数中声明的局部变量的数量?

时间:2016-09-17 16:23:27

标签: python metaprogramming

在Python测试夹具中,是否可以计算函数在其体内声明的局部变量数量?

def foo():
    a = 1
    b = 2

Test.assertEqual(countLocals(foo), 2)

或者,有没有办法查看函数是否声明了任何变量?

def foo():
    a = 1
    b = 2

def bar():
    pass

Test.assertEqual(hasLocals(foo), True)
Test.assertEqual(hasLocals(bar), False)

我想到的用例与验证用户提交的代码有关。

2 个答案:

答案 0 :(得分:8)

是的,关联的代码对象会考虑co_nlocals属性中的所有本地名称:

foo.__code__.co_nlocals

演示:

>>> def foo():
...     a = 1
...     b = 2
...
>>> foo.__code__.co_nlocals
2

请参阅Datamodel documentation

  

用户定义的功能

     

[...]

     

__code__代表已编译函数体的代码对象。

     

代码对象

     

[...]

     

特殊只读属性: [...] co_nlocals是函数使用的局部变量数(包括参数); [...]

答案 1 :(得分:1)

要详细说明@Martijn的优秀答案,如果您阅读inspect — Inspect live objects模块的文档,您可以看到它允许对大量数据进行内省,包括(如@Martijn所述){ {1}}类型,以下属性:

code