Si desea una sangría en términos de nivel de anidación en lugar de espacios y pestañas, las cosas se ponen difíciles. Por ejemplo, en el siguiente código:
if True:
print(
get_nesting_level())
la llamada a get_nesting_level
está anidada en un nivel de profundidad, a pesar del hecho de que no hay espacios en blanco iniciales en la línea de la get_nesting_level
llamada. Mientras tanto, en el siguiente código:
print(1,
2,
get_nesting_level())
la llamada a get_nesting_level
está anidada a cero niveles de profundidad, a pesar de la presencia de espacios en blanco iniciales en su línea.
En el siguiente código:
if True:
if True:
print(get_nesting_level())
if True:
print(get_nesting_level())
las dos llamadas a get_nesting_level
están en diferentes niveles de anidación, a pesar de que el espacio en blanco inicial es idéntico.
En el siguiente código:
if True: print(get_nesting_level())
¿Es eso cero niveles anidados, o uno? En términos de INDENT
y DEDENT
tokens en la gramática formal, tiene cero niveles de profundidad, pero es posible que no sienta lo mismo.
Si desea hacer esto, tendrá que tokenizar todo el archivo hasta el punto de la llamada y contar INDENT
y DEDENT
tokens. El tokenize
módulo sería muy útil para tal función:
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
get_indentation_level()
enunciado en tu código. Puedes hacerprint(3)
lo mismo o lo que sea directamente. Lo que podría ser más interesante es el nivel actual de anidamiento en la pila de llamadas de función.depth
parámetro y agregarle el valor apropiado según sea necesario cuando lo pase a otras funciones. No es probable que la anidación de su código corresponda limpiamente a la sangría que desea de su salida.