Si vous voulez de l'indentation en termes de niveau d'imbrication plutôt que d'espaces et de tabulations, les choses deviennent difficiles. Par exemple, dans le code suivant:
if True:
print(
get_nesting_level())
l'appel à l' get_nesting_level
est en fait à-dire un niveau profond, malgré le fait qu'il n'y a aucun espace sur la ligne de l' get_nesting_level
appel. Pendant ce temps, dans le code suivant:
print(1,
2,
get_nesting_level())
l'appel à l' get_nesting_level
est imbriqué à zéro des niveaux de profondeur, malgré la présence des principaux espaces sur sa ligne.
Dans le code suivant:
if True:
if True:
print(get_nesting_level())
if True:
print(get_nesting_level())
les deux appels d' get_nesting_level
sont à différents niveaux d'imbrication, malgré le fait que le premier espace est identique.
Dans le code suivant:
if True: print(get_nesting_level())
c'est que imbriquée zéro, ou un seul? En termes de INDENT
et DEDENT
de jetons dans la grammaire formelle, c'est le zéro de niveaux de profondeur, mais vous pourriez ne pas sentir de la même manière.
Si vous voulez faire cela, vous allez devoir marquer l'ensemble du dossier jusqu'au moment de l'appel et count INDENT
et DEDENT
des jetons. L' tokenize
module serait très utile pour cette fonction:
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