gpt4 book ai didi

python - 一行 Python 代码能知道它的缩进嵌套级别吗?

转载 作者:IT老高 更新时间:2023-10-28 12:25:33 25 4
gpt4 key购买 nike

从这样的事情:

print(get_indentation_level())

print(get_indentation_level())

print(get_indentation_level())

我想得到这样的东西:

1
2
3

代码可以这样读取自己吗?

我想要的只是更多嵌套的代码部分的输出。就像这使代码更易于阅读一样,它会使输出更易于阅读。

当然,我可以手动实现这一点,例如使用.format(),但我想到的是一个自定义打印函数,它将 print(i*' ' + string) where i是缩进级别。这将是在我的终端上生成可读输出的快速方法。

有没有更好的方法来避免繁琐的手动格式化?

最佳答案

如果您想根据嵌套级别而不是空格和制表符来缩进,事情就会变得棘手。例如,在以下代码中:

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())

是嵌套的零层还是一层?就形式语法中的 INDENTDEDENT 标记而言,它的深度为零,但您可能会有不同的感觉。


如果你想这样做,你将不得不对整个文件进行标记,直到调用点并计算 INDENTDEDENT 标记。 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

关于python - 一行 Python 代码能知道它的缩进嵌套级别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39172306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com