如果想在嵌套级别而不是空格和制表符上缩进,事情就变得棘手了。例如,在以下代码中:if True:
print(
get_nesting_level())
实际上嵌套了一个级别,同时,在以下代码中:print(1,
2,
get_nesting_level())
或者:if True:
if True:
print(get_nesting_level())
if True:
print(get_nesting_level())
再次:if True: print(get_nesting_level())
如果想要这样做,则必须将整个文件标记到调用和计数的顶点。import inspect
import tokenize
def get_nesting_level():
caller_frame = inspect.currentframe().f_back
filename, caller_lineno, _, _, _ = inspect.getframeinfo(caller_frame)
with open(filename) as f:
indentation_level = 0
for token_record in tokenize.generate_tokens(f.readline):
token_type, _, (token_lineno, _), _, _ = token_record
if token_lineno > caller_lineno:
break
elif token_type == tokenize.INDENT:
indentation_level += 1
elif token_type == tokenize.DEDENT:
indentation_level -= 1
return indentation_level