
Dies ist die fünfte Sammlung von Python-Tipps und -Programmierungen aus meinem @ pythonetc-Feed.
Vorherige Auswahl:
Trennzeichen -
Jedes anständige Befehlszeilenprogramm sollte Argumente in Form von Optionen (z. B.
-h oder
--help ), Optionen mit Parametern (
--log-level 2 ) oder Positionsparametern (
cp file1 file2 )
annehmen .
Optionen unterscheiden sich von Positionsparametern durch das Vorhandensein von ein oder zwei Strichen am Anfang. Wenn Positionsargumente mit einem Bindestrich beginnen, treten Probleme auf: Wenn Sie eine Datei mit dem Namen
-rf löschen möchten, hilft Ihnen der
Befehl rm -rf dabei nicht weiter.
Ein einfacher Ausweg besteht darin, zwei Striche als Trennzeichen zu verwenden. Argumente nach - gelten nicht als Optionen:
$ echo test > -rf $ cat -rf cat: invalid option -- 'r' Try 'cat --help' for more information. $ cat -- -rf test $ rm -- -rf $ cat -- -rf cat: -rf: No such file or directory
Das argparse-Modul unterstützt standardmäßig zwei Striche.
Sortierstabilität
Die Standardsortierung in Python ist robust. Die
sortierte Funktion ändert die Reihenfolge gleicher Objekte nicht:
In : a = [2, -1, 0, 1, -2] In : sorted(a, key=lambda x: x**2) Out: [0, -1, 1, 2, -2]
Die
Min- und
Max- Funktionen stimmen auch mit der
Sortierung überein
. max funktioniert wie
sortiert (a, reverse = True) [0] und
min funktioniert wie
sortiert ( a) [0] . Dies bedeutet, dass beide Funktionen die Antwort ganz links zurückgeben:
In : max([2, -2], key=lambda x: x**2) Out: 2 In : max([-2, 2], key=lambda x: x**2) Out: -2 In : min([2, -2], key=lambda x: x**2) Out: 2 In : min([-2, 2], key=lambda x: x**2) Out: -2
Cache im Standardargument
Der vielleicht häufigste Fehler unter unerfahrenen Pythonisten besteht darin, ein veränderliches Objekt als Argument für die Standardfunktion anzugeben. Das Trennen dieses Objekts zwischen Funktionsaufrufen kann zu den seltsamsten Ergebnissen führen:
def append_length(lst=[]): lst.append(len(lst)) return lst print(append_length([1, 2]))
Eine solche Freigabe ist jedoch sogar nützlich, wenn Sie das Objekt zum Erstellen eines freigegebenen Caches verwenden:
def fact(x, cache={0: 1}): if x not in cache: cache[x] = x * fact(x - 1) return cache[x] print(fact(5))
In diesem Beispiel setzen wir die berechneten Fakultätswerte in die Standardargumentwerte ein. Solche Werte können sogar extrahiert werden:
>>> fact.__defaults__ ({0: 1, 1: 1, 2: 2, 3: 6, 4: 24, 5: 120},)
Arbeite mit FS
Mit dem Modul
os.path können Sie mit Dateisystempfaden
arbeiten . Das Modul enthält viele Funktionen, die Zeichenfolgen als Dateipfade behandeln und verschiedene nützliche Vorgänge wie die Verkettung ausführen:
>>> import os.path >>> os.path.join('/usr', 'local') '/usr/local' >>> os.path.dirname('/var/log') '/var'
Ab Version 3.4 enthält Python ein
Pathlib- Modul, das einen objektorientierten Ansatz bietet:
>>> from pathlib import Path >>> Path('/usr') / Path('local') PosixPath('/usr/local') >>> Path('/usr') / 'local' PosixPath('/usr/local') >>> Path('/var/log').parent PosixPath('/var') >>> Path('/var/log').parent.name 'var'
Aufgerufene Objekte
In Python können Sie ein aufrufbares Objekt nicht nur erstellen, indem Sie Funktionen erstellen (mithilfe der Syntax
def oder
lambda ). Ein Objekt kann
aufgerufen werden, wenn es eine
__call__- Methode hat:
class Truncater: def __init__(self, length): self._length = length def __call__(self, s): return s[0:self._length] print(Truncater(4)('abcdabcd'))
Da der Dekorateur im Wesentlichen eine Funktion höherer Ordnung ist, kann er auch durch das aufgerufene Objekt ausgedrückt werden, nicht durch eine Funktion:
class cached: def __init__(self, func): self._func = func self._cache = {} def __call__(self, arg): if arg not in self._cache: self._cache[arg] = self._func(arg) return self._cache[arg] @cached def sqr(x): return x * x