比如下面这样的:print(get_indentation_level()) print(get_indentation_level()) print(get_indentation_level())
我想获取到这样的结果:1
2
3
代码能否通过这种方式读取自身?
我想要的是更多的嵌套部分的代码的输出更多的嵌套。 用同的方式,这使得代码更容易阅读,也使输出更容易阅读。
当然我可以手动实现,使用例如 .format(),但我想到的是一个自定义 print 函数,它将print(i*' ' + string),其中i是缩进级别。这会是一个在终端中产生可读输出的快速方法。有没有更好的、能避免辛苦的手动格式化的方法来做到这一点?
如果你想要嵌套级别的缩进,而不是空格和制表符,事情变得棘手。 例如,在下面的代码中:if True:
print(
get_nesting_level())
对get_nesting_level的调用实际上是嵌套1级,尽管事实上在get_nesting_level的调用行前没有空格。同时,在下面的代码中:print(1,
2,
get_nesting_level())
对get_nesting_level的调用是嵌套0级,尽管在它所在行前存在空格。
在下面的代码中:if True:
if True:
print(get_nesting_level())if True:
print(get_nesting_level())
对get_nesting_level的两次调用处于不同的嵌套级别,尽管空格数是一样的。在下面的代码中:if True: print(get_nesting_level())
是嵌套0级,还是1级? 在正式语法中,对于INDENT和DEDENT符号,它是0级,但你可能不会有同样的感觉。如果你想这样做,你将必须符号化整个文件,并为INDENT和DEDENT符号计数。tokenize模块对于这样的函数非常有用的:import inspect
import tokenizedef 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