如何计算脚本中分配的变量数?
例如,通过 line_no = 80,有 num_globals = y 和 num_locals = z。
编辑
我知道局部变量并不都属于一个大的集体局部变量范围,它们在不同的局部范围内,但是有没有一种好方法可以浏览脚本并对我们看到的所有局部变量求和?
例如:
def foo():
#Two local variables
a=1
b=2
def bar():
#Two more local variables
a=10
for i in range(a):
a+=1
b=sum(i for i in range(10))
num_encountered_locals = 4
从全新的 Python 3.4 命令行引导中查看以下示例:
>>> len(globals())
6
>>> len(locals())
6
马上有 6 个全局变量,因为我们目前处于全局范围内,所以也有 6 个局部变量:
>>> a = 1
>>> b = 2
>>> c = 3
>>> len(globals())
9
>>> len(locals())
9
现在我们添加了 3 个变量,这两个变量现在都是 9。
>>> def foo():
... a = 1
... b = 2
... print(len(locals()))
... print(len(globals()))
...
现在我们添加了函数foo
(这是在全局范围内定义的,因此在全局范围内也由全局/局部变量计数):
>>> print(len(locals()))
10
>>> print(len(globals()))
10
最后,请注意,在函数中,只有函数中的变量在局部变量中,而全局变量仍然包含全局范围内的所有内容:
>>> foo()
2
10
使用此逻辑,您可以使用len(locals())
获取函数中定义的变量/函数的数量,len(globals()) - 6
获取全局范围内定义的所有变量/函数的列表。
编辑(请注意,以下都是一个新终端)
通过使用:
sum([not callable(globals()[i]) for i in globals()])
您可以获取当前在全局范围内的变量(不包括函数)的数量。通过将其分配给变量,您可以获得当前定义的变量列表:
>>> globs = sum([not callable(globals()[i]) for i in globals()])
>>> sum([not callable(globals()[i]) for i in globals()]) - globs - 1 # -1 for globs
0
现在:
>>> a = 1
>>> b = 2
>>> c = 3
>>> sum([not callable(globals()[i]) for i in globals()]) - globs - 1
3
>>> def foo():
... a = 1
... b = 1
... print(len(locals()))
...
>>> foo()
2
>>> sum([not callable(globals()[i]) for i in globals()]) - globs - 1
3
因此,通过在代码顶部添加globs = sum([not callable(globals()[i]) for i in globals()])
,那么每次调用sum([not callable(globals()[i]) for i in globals()]) - globs - 1
都会在这一点上给出定义数量的变量(这是在全局范围内,您可以使用类似的locs = sum([not callable(locals()[i]) for i in locals()])
方法在函数中执行相同的操作)。
编辑 2
我不确定是否有一种本地方式来完成您的要求,但是您有几个选择:
- 解析脚本(这是很多努力)
- 保留一个计数器,在每次函数调用结束时递增:
>>>num_encountered_locals = 0
>>>def foo():
global num_encountered_locals
a = 1
b = 2
num_encountered_locals += len(locals())
>>>num_encountered_locals
0
>>>foo()
>>>num_encountered_locals
2
>>>foo()
>>>foo()
>>>foo()
>>>num_encountered_locals
8
(由于某种原因,最后一批代码无法正确格式化,所以我不得不将其放入<code>
并手动<pre>
标签)
脚本执行后,可以调用globals
并locals
。它们都返回字典。https://docs.python.org/2/library/functions.html#globals
为了计数到第 80 行(例如),您需要在该行停止执行(也许添加一个断点),然后调用这些方法。