Von so etwas:
print(get_indentation_level())
print(get_indentation_level())
print(get_indentation_level())
Ich möchte so etwas bekommen:
1
2
3
Kann sich der Code auf diese Weise selbst lesen?
Ich möchte nur, dass die Ausgabe der stärker verschachtelten Teile des Codes stärker verschachtelt ist. Auf die gleiche Weise, wie dies das Lesen von Code erleichtert, würde dies das Lesen der Ausgabe erleichtern.
Natürlich könnte ich dies manuell implementieren, z. B. .format()
, aber ich hatte eine benutzerdefinierte Druckfunktion im Sinn, print(i*' ' + string)
bei der i
die Einrückungsstufe angegeben wird. Dies wäre eine schnelle Möglichkeit, eine lesbare Ausgabe auf meinem Terminal zu erstellen.
Gibt es einen besseren Weg, um mühsame manuelle Formatierungen zu vermeiden?
python
reflection
metaprogramming
indentation
tokenize
Fab von Bellingshausen
quelle
quelle
get_indentation_level()
Aussage in Ihren Code einfügen. Sie können genauso gutprint(3)
oder was auch immer direkt tun . Was vielleicht interessanter ist, ist die aktuelle Verschachtelungsebene auf dem Funktionsaufrufstapel.depth
, wenn Sie einen Parameter explizit weitergeben und ihm bei Bedarf den entsprechenden Wert hinzufügen, wenn Sie ihn an andere Funktionen übergeben. Die Verschachtelung Ihres Codes entspricht wahrscheinlich nicht genau dem Einzug, den Sie aus Ihrer Ausgabe heraus wünschen.Antworten:
Wenn Sie Einrückungen in Bezug auf die Verschachtelungsebene anstelle von Leerzeichen und Tabulatoren wünschen, wird es schwierig. Zum Beispiel im folgenden Code:
Der Aufruf von
get_nesting_level
ist tatsächlich eine Ebene tief verschachtelt, obwohl in der Zeile desget_nesting_level
Anrufs kein führendes Leerzeichen vorhanden ist . Inzwischen im folgenden Code:Der Aufruf von
get_nesting_level
ist trotz des Vorhandenseins führender Leerzeichen in seiner Zeile null Ebenen tief verschachtelt.Im folgenden Code:
Die beiden Aufrufe von
get_nesting_level
befinden sich auf unterschiedlichen Verschachtelungsebenen, obwohl das führende Leerzeichen identisch ist.Im folgenden Code:
Ist das verschachtelte Null-Ebenen oder Eins? In Bezug auf
INDENT
undDEDENT
Token in der formalen Grammatik ist es null Stufen tief, aber Sie fühlen sich möglicherweise nicht so.Wenn Sie dies tun möchten, müssen Sie die gesamte Datei bis zum Zeitpunkt des Aufrufs tokenisieren und zählen
INDENT
undDEDENT
token. Dastokenize
Modul wäre für eine solche Funktion sehr nützlich:quelle
get_nesting_level()
es innerhalb dieses Funktionsaufrufs aufgerufen wird. Es gibt die Verschachtelungsebene innerhalb dieser Funktion zurück. Könnte es umgeschrieben werden, um die 'globale' Verschachtelungsebene zurückzugeben?while
und inkrementiertwith
wird, ist dies machbar, aber nicht das, wonach Sie gefragt haben, und ändern Sie die Frage, um an dieser Stelle etwas anderes zu stellen wäre eine schlechte Idee.linecache
Modul für solche Dinge - es wird zum Drucken von Tracebacks verwendet und kann Module verarbeiten, die aus Zip-Dateien und anderen seltsamen Importtricks importiert wurden)linecache
Vielleicht ist es gut, um die Anzahl der Datei-E / A zu reduzieren (und danke, dass Sie mich daran erinnert haben), aber wenn ich anfangen würde, dies zu optimieren, würde es mich stören, wie wir dieselbe Datei für Wiederholungen der Datei redundant neu tokenisieren gleicher Anruf oder für mehrere Anrufstellen innerhalb derselben Datei. Es gibt eine Reihe von Möglichkeiten, wie wir das auch optimieren können, aber ich bin mir nicht sicher, wie sehr ich dieses verrückte Ding wirklich stimmen und kugelsicher machen möchte.Ja, das ist definitiv möglich, hier ist ein funktionierendes Beispiel:
quelle
print('{Space}'*get_indentation_level(), x)
Sie können verwenden
sys.current_frame.f_lineno
, um die Zeilennummer zu erhalten. Um die Anzahl der Einrückungsstufen zu ermitteln, müssen Sie die vorherige Zeile mit der Einrückung Null suchen und dann die aktuelle Zeilennummer von der Nummer dieser Zeile abziehen. Sie erhalten die Anzahl der Einrückungen:Demo:
Wenn Sie die Nummer der Einrückungsstufe basierend auf den vorherigen Zeilen mit möchten
:
, können Sie dies einfach mit einer kleinen Änderung tun:Demo:
Als alternative Antwort gibt es hier eine Funktion zum Abrufen der Anzahl der Einrückungen (Leerzeichen):
quelle
:
bis wir auf die Zeile mit null Einrückung stoßen. Schauen Sie sich die Bearbeitung an!{3:4, \n 2:get_ind_num()}
Um das "echte" Problem zu lösen, das zu Ihrer Frage führt, können Sie einen Kontextmanager implementieren, der die Einrückungsstufe verfolgt und die
with
Blockstruktur im Code den Einrückungsstufen der Ausgabe entspricht. Auf diese Weise spiegelt der Codeeinzug immer noch den Ausgabeeinzug wider, ohne beide zu stark zu koppeln. Es ist weiterhin möglich, den Code in verschiedene Funktionen umzugestalten und andere Einrückungen basierend auf der Codestruktur zu verwenden, die nicht mit der Ausgabeeinrückung in Konflikt geraten.Ausgabe:
quelle
quelle