In der Python-Welt gibt es mehrere Code-Formatierer - z.B. Black, YAPF und autopep8. Ich persönlich bevorzuge Black, da es absichtlich nicht konfigurierbar ist. Es gibt nicht viel zu konfigurieren und das Tool ist ziemlich eigenwillig, was die Formatierung von Code angeht, was dazu führt, dass ich manchmal in PyCharm auf ⌥⌘L klicke und Black den Rest erledigt. Hinweis: Dieser Blogbeitrag wurde speziell für PyCharm und MacOS geschrieben, obwohl die Ideen auch anderswo verwendet werden können.
Schwarz formatiert dies zum Beispiel automatisch:
mything = DemoClass('hallo', "Welt", arg1="dies", arg2="ist", arg3='sehr', arg4="hässlich", arg5="Formatierung", arg6="So kodiert sowieso niemand")
Hier hinein:
mything = DemoClass( "hallo", "Welt", arg1="dies", arg2="ist", arg3="sehr", arg4="hässlich", arg5="Formatierung", arg6="So kodiert sowieso niemand", )
Bei der Arbeit an Open-Source-Projekten stellt dies jedoch ein Problem dar, da die Neuformatierung des Codes auf die gesamte Datei angewendet wird, einschließlich des Codes, den ich nicht anfassen möchte. Das führt dazu, dass ich den Code neu formatieren, die geänderten Zeilen, die ich formatieren wollte, kopieren, die Formatierung rückgängig machen und meine Zeilen durch die kopierten Zeilen ersetzen muss. Das kam mir sehr umständlich vor, und so ging ich der Sache auf den Grund.
Installation und Konfiguration in PyCharm
Zunächst müssen wir Black installieren und in PyCharm konfigurieren. Es ist sowohl über Pip als auch über Conda verfügbar und läuft auf Python 3.6 und höher, obwohl es auch älteren Python-Code formatieren kann. Nach der Installation können Sie
Um Black in PyCharm zu verwenden, gehen Sie zu PyCharm -> Preferences... (⌘,) -> Tools -> External Tools -> Klicken Sie auf das Symbol +, um ein neues externes Tool hinzuzufügen. Konfigurieren Sie wie oben gezeigt und gehen Sie auf Extras -> Externe Tools -> Schwarz, um Ihre aktuelle Datei neu zu formatieren. Zusätzlich können Sie die Standardverknüpfung von PyCharm Code neu formatieren mit Black überschreiben, indem Sie eine Tastaturbelegung konfigurieren.
Teilweise Formatierung
Black formatiert nur ganze Dateien, was bei der Arbeit mit Open Source Code ein Problem darstellt. Zum Glück gibt es in der Konfiguration des externen Tools PyCharm viele Variablen. Klicken Sie in der Konfiguration auf Insert Macro..., um sie alle zu sehen:
Um eine partielle Black-Formatierung anzuwenden, benötigen wir zumindest die ausgewählten Zeilennummern, die durch SelectionStartLine und SelectionEndLine angegeben werden. Ich habe ein kleines Bash-Skript erstellt, das als externes Tool in PyCharm aufgerufen wird. Beachten Sie, dass die sed-Befehle MacOS-spezifisch sind:
#!/usr/bin/env bash einstellen. -x schwarz=$1 eingabe_datei=$2 start_line=$3 end_line=$4 # Ausgewählte Zeilen lesen und in tmpfile schreiben Auswahl=$(sed -n "$start_line, $end_line p; $(($end_line+1)) q" < $input_file) tmpfile=$(mktemp) echo "$Auswahl" > "$tmpfile" # Schwarze Formatierung auf tmpfile anwenden $bfehlt $tmpfile # Originalzeilen aus der Datei löschen sed -i "" "$start_line,$end_line d" $eingabe_datei # Und fügen Sie neu formatierte Zeilen ein. sed -i "" "$(($start_line-1)) r $tmpfile" $eingabe_datei
Der Code ist auch verfügbar unter Black on selection - GitHub
Lassen Sie uns das aufschlüsseln:
1. PyCharm Konfiguration
Das Skript akzeptiert vier Argumente: (1) Schwarzer Ort, (2) Eingabedatei, (3) Startzeile der Auswahl und (4) Endzeile der Auswahl.
schwarz=$1 eingabe_datei=$2 start_line=$3 end_line=$4
Das Skript wird zusammen mit den vier Argumenten von PyCharm aufgerufen:
2. Auswahl abrufen
# Ausgewählte Zeilen lesen und in tmpfile schreiben Auswahl=$(sed -n "$start_line, $end_line p; $(($end_line+1)) q" < $input_file) tmpfile=$(mktemp) echo "$Auswahl" > "$tmpfile"
Mit etwas sed-Magie hole ich die Auswahl aus der Eingabedatei und schreibe sie in eine tmp-Datei. Der sed-Befehl führt z.B. sed -n "4, 7 p; 8 q" < /path/to/input/file aus, wobei 4 die Startzeilennummer ist, 7 die Endzeilennummer, p, um die Zeilen zu drucken und 8 q, um das Scannen der Datei nach der folgenden Zeile zu beenden, was bei sehr langen Dateien nützlich ist. Das Flag -n unterdrückt die Ausgabe des Echos auf stdout. Das Ergebnis sind die ausgewählten Zeilen, die in die tmpfile geschrieben werden.
3. Schwarz auf die Auswahl anwenden
# Schwarze Formatierung auf tmpfile anwenden $bfehlt $tmpfile
Das Black-Binary wird in der tmp-Datei ausgeführt.
4. Formatierte Auswahl wieder in die Originaldatei einfügen
# Originalzeilen aus der Datei löschen sed -i "" "$start_line,$end_line d" $eingabe_datei # Und fügen Sie neu formatierte Zeilen ein. sed -i "" "$(($start_line-1)) r $tmpfile" $eingabe_datei
Sed unter MacOS und Zeilenumbrüche arbeiten nicht gut zusammen und der sed-Befehl, der zum Ersetzen von Zeilen durch eine Variable mit Zeilenumbrüchen erforderlich ist, wurde zu umständlich. Also beschloss ich, weniger Magie zu schreiben und das Ersetzen des Ergebnisses in zwei Zeilen aufzuteilen: (1) Entfernen der ursprünglichen Zeilen aus der Eingabedatei und (2) Einfügen der Zeilen aus der formatierten tmp-Datei zurück in die Eingabedatei. Sed auf MacOS erfordert eine Erweiterung für Backups, die durch das Flag -i angegeben wird. Da ich keine Backups möchte, wird eine leere Zeichenkette angegeben.
5. PyCharm-Verknüpfung
Schließlich erstellen Sie eine PyCharm-Verknüpfung zum Formatieren einer Auswahl:
Mit diesem ⌥⌘; Shortcut können wir nun das Skript aufrufen, um nur die Auswahl zu formatieren:
Letzte Worte
Das Skript ist nicht narrensicher. Wenn Sie z.B. einen halben Codeblock auswählen, wird Black die Formatierung nicht durchführen. Allerdings macht es die Formatierung von Code für Open-Source-Projekte ein wenig effizienter, was mich zu einem glücklichen Programmierer macht.
Unsere Ideen
Weitere Blogs
Contact



