如果您想缩进而不是使用空格和制表符来嵌套级别,那么事情就会变得棘手。例如,在以下代码中:
if True:
print(
get_nesting_level())
get_nesting_level
尽管实际上在行的行上没有前导空格,但对的调用实际上嵌套了一层深度get_nesting_level
呼叫。同时,在以下代码中:
print(1,
2,
get_nesting_level())
致电 get_nesting_level
尽管该行中存在领先的空格,对仍嵌套在零级深度。
在下面的代码中:
if True:
if True:
print(get_nesting_level())
if True:
print(get_nesting_level())
两次致电 get_nesting_level
尽管前导空白是相同的,但这处于不同的嵌套级别。
在下面的代码中:
if True: print(get_nesting_level())
是嵌套的零级,还是一级?在INDENT
和DEDENT
形式语法中标记,深度为零,但是您可能会感觉不一样。
如果要执行此操作,则必须标记整个文件,直到调用,计数INDENT
和DEDENT
标记为止。该tokenize
模块对于此类功能非常有用:
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