@ Pythonetc Oktober 2018

Bild

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])) # [1, 2, 2] print(append_length()) # [0] print(append_length()) # [0, 1] 

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')) # abcd 

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 

Source: https://habr.com/ru/post/de429186/


All Articles