Ich habe mir gedacht ich schau mir mal die Snippets an, zum einen, da da bestimmt was brauchbares dabei ist, zum andern, da man dadurch bestimmt auch viel über die Sprache selbst lernen kann.
Maja, direkt beim ersten Snippet habe ich erstmal 20 minuten gesessen, bis ich das vollends entziffert habe, und bin immer noch nicht sicher, ob ich das alles korrekt verstanden habe. Es wird verwendet, um die Oktalschreibweise der Linux-Rechte in die Symbolische Schreibweise zu überführen
Nun gut, ich machs folgendermaßen:
* Code Zeigen
* code durchgehen
* erläutern, was man dadurch implizit zu Lernen gemeint hat
1. Code
Code: Alles auswählen
import os
def symbolic_notation(mode):
return ''.join(
mode & 0400 >> i and x or '-' for i, x in enumerate('rwxrwxrwx')
)
print symbolic_notation(os.stat('blub').st_mode)
(Ih weiß, dass dazu einen Thread gibt; da dieser aber fast zwei Jahre alt ist, und ich kein keine Leichenschändung begehen wollte, habe ich einen neuen eröffnet)
2. Funktionsweise
Mich interessiert insbesondere die Zeile, welche den anzuhängenden Char ermittelt; den Rest kann ich problemlos lesen. Also:
- *Zuerst wird mittels einem enumerate ein String enommen und daraus Charweise für eine for-Schleife zwei Variablen i ud x jeweils der Index bzw. der entsprechende Char übergeben
*danach wird die Bitdarstellung von 0400 i mal bitweise nach rechts verschoben. Soweit ich weiß ist der von stat().st_mode übergebene Wert auch oktal; auf diese Weise bezweckt man zweierlei: zum einen werden nur die normalen Benutzerrechte ausgewertet; Sticky-bits und sowas werden ignoriert. Zum andern kann man beim highest bit (also dem User-r-bit in Symbolischer notation) anfangen und sich durch den String durcharbeiten
*Danach wird der erzeugte Wert mit dem modus bitweise verundet
*Das Logische UND danach sorgt für folgendes: ist der Vorherige Wert 1, so wird der in x vorhandene char - also der aktuelle Wert aus dem String - zurück gegeben
*das logische ODER danach sorgt dafür, dass, falls der vorherige Wert 0 war, ein minus zurück gegeben wird.
- * was in der gleichen Zeile vor einem for-Statement steht ist im Grunde der entsprechende Code-Block, der normalerweise darunter steht
* ein Bitshifting bindet stärker als ein bitweises UND
* die numerische 1 und das logische True werden identisch behandelt
* eine Aussage ist solange True, wie sie nicht explizit False bzw 0 ist (sonst könnte das logische UND gar nicht funktionieren)
* wenn ein logisches UND wahr ist, so wird der Wert des zweiten Parameters zurück gegeben, egal, ob dieser von einer Aussage oder eine Variable kommt bzw. was dieser für einen Typ hat
* für das logische ODER gilt ähnliches: ist der erste Parameter nicht falsh, so wird der Wert dessen zurück gegeben, ansonsten der Wert des zweiten
* Oktalzahlen werden in Python mit einer führenden Null gekennzeichnet (wobei sich das glaube ich mit der Version 3.x geändert hat. Klappt das Snippet hier dann überhaupt noch)