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

Sag*_*ard 2 python metaprogramming

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

def foo():
    a = 1
    b = 2

Test.assertEqual(countLocals(foo), 2)
Run Code Online (Sandbox Code Playgroud)

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

def foo():
    a = 1
    b = 2

def bar():
    pass

Test.assertEqual(hasLocals(foo), True)
Test.assertEqual(hasLocals(bar), False)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 8

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

foo.__code__.co_nlocals
Run Code Online (Sandbox Code Playgroud)

演示:

>>> def foo():
...     a = 1
...     b = 2
...
>>> foo.__code__.co_nlocals
2
Run Code Online (Sandbox Code Playgroud)

请参阅Datamodel文档:

用户定义的函数

[...]

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

代码对象

[...]

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