在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)
我想到的用例与验证用户提交的代码有关。
答案 0 :(得分:8)
是的,关联的代码对象会考虑co_nlocals
属性中的所有本地名称:
foo.__code__.co_nlocals
演示:
>>> def foo():
... a = 1
... b = 2
...
>>> foo.__code__.co_nlocals
2
用户定义的功能
[...]
__code__
代表已编译函数体的代码对象。代码对象
[...]
特殊只读属性: [...]
co_nlocals
是函数使用的局部变量数(包括参数); [...]
答案 1 :(得分:1)
要详细说明@Martijn的优秀答案,如果您阅读inspect — Inspect live objects模块的文档,您可以看到它允许对大量数据进行内省,包括(如@Martijn所述){ {1}}类型,以下属性:
code