exception königspython - Gibt es einen plattformübergreifenden Weg Informationen von Pythons OSError zu erhalten?




größe fütterung (2)

Das errno Attribut für den Fehler sollte auf allen Plattformen identisch sein. Sie erhalten WindowsError Ausnahmen unter Windows, aber da es sich um eine Unterklasse von OSError handelt, wird derselbe " except OSError: " - Block es abfangen. Windows verfügt über eigene Fehlercodes, auf die als .winerror .errno Attribut .errno sollte jedoch weiterhin vorhanden sein und auf plattformübergreifende Weise verwendet werden können.

Symbolische Namen für die verschiedenen Fehlercodes finden Sie im errno Modul. Beispielsweise,

import os, errno
try:
    os.mkdir('test')
except OSError, e:
    if e.errno == errno.EEXIST:
        # Do something

Sie können auch die umgekehrte Suche (um herauszufinden, welchen Code Sie verwenden sollten) mit errno.errorcode . Das ist:

>>> errno.errorcode[17]
'EEXIST'

Bei einer einfachen Verzeichniserstellung zum Beispiel kann ich einen OSError wie folgt machen:

(Ubuntu Linux)

>>> import os
>>> os.mkdir('foo')
>>> os.mkdir('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists: 'foo'

Jetzt kann ich diesen Fehler so verstehen:

>>> import os
>>> os.mkdir('foo')
>>> try:
...     os.mkdir('foo')
... except OSError, e:
...     print e.args
... 
(17, 'File exists')

Gibt es einen plattformübergreifenden Weg, von dem ich wissen kann, dass die 17 oder die "Datei existiert" immer dasselbe bedeutet, damit ich je nach Situation anders handeln kann?

(Dies kam während einer anderen Frage auf .)


Python enthält eine Funktion namens itemgetter, um das Element an einem bestimmten Index in einer Liste zurückzugeben:

from operator import itemgetter

Übergeben Sie die Funktion itemgetter () an den Index des Elements, das Sie abrufen möchten. Um das erste Element abzurufen, verwenden Sie itemgetter (0). Es ist wichtig zu verstehen, dass itemgetter (0) selbst eine Funktion zurückgibt. Wenn Sie eine Liste an diese Funktion übergeben, erhalten Sie das spezifische Element:

itemgetter(0)([10, 20, 30]) # Returns 10

Dies ist nützlich, wenn Sie es mit map () kombinieren, das eine Funktion als erstes Argument und eine Liste (oder ein anderes iterables) als zweites Argument verwendet. Sie gibt das Ergebnis des Aufrufs der Funktion für jedes Objekt im iterablen Objekt zurück:

my_list = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']]
list(map(itemgetter(0), my_list)) # Returns ['a', 1, 'x']

Beachten Sie, dass map () einen Generator zurückgibt, sodass das Ergebnis an list () übergeben wird, um eine aktuelle Liste zu erhalten. Zusammenfassend könnte Ihre Aufgabe wie folgt ausgeführt werden:

lst2.append(list(map(itemgetter(0), lst)))

Dies ist eine alternative Methode zur Verwendung eines Listenverständnisses, und welche Methode zu wählen ist, hängt stark von Kontext, Lesbarkeit und Präferenz ab.

Weitere Informationen finden Sie unter https://docs.python.org/3/library/operator.html#operator.itemgetter





python exception cross-platform