Für 3.1+ eine der folgenden Möglichkeiten:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Für 2.x ist "dateiähnliches Objekt" zu vage, um es zu überprüfen, aber die Dokumentation für alle Funktionen, mit denen Sie sich befassen, wird Ihnen hoffentlich sagen, was sie tatsächlich benötigen. Wenn nicht, lesen Sie den Code.
Wie andere Antworten zeigen, müssen Sie zunächst fragen, worauf Sie genau achten. Normalerweise ist EAFP ausreichend und idiomatischer.
Das Glossar sagt „file-ähnliches Objekt“ ist ein Synonym für „Dateiobjekt“, was letztlich bedeutet , dass es eine Instanz von einem der drei ist abstrakte Basisklassen in definiert das io
Modul , die sich alle Subklassen von sind IOBase
. Die Art der Überprüfung ist also genau wie oben gezeigt.
(Die Überprüfung IOBase
ist jedoch nicht sehr nützlich. Können Sie sich einen Fall vorstellen, in dem Sie eine tatsächliche dateiähnliche read(size)
Funktion von einer Funktion mit einem Argument unterscheiden müssen read
, die nicht dateiähnlich ist, ohne auch zwischen Textdateien und RAW unterscheiden zu müssen? Binärdateien? Sie möchten also eigentlich fast immer überprüfen, z. B. "Ist ein Textdateiobjekt", nicht "Ist ein dateiähnliches Objekt".)
Während das io
Modul für 2.x seit 2.6+ existiert, sind integrierte Dateiobjekte keine Instanzen von io
Klassen, keines der dateiähnlichen Objekte in der stdlib und auch nicht die meisten dateiähnlichen Objekte von Drittanbietern sind wahrscheinlich zu begegnen. Es gab keine offizielle Definition dessen, was "dateiähnliches Objekt" bedeutet; es ist nur „so etwas wie ein eingebautes Dateiobjekt “, und verschiedene Funktionen bedeuten verschiedene Dinge durch „wie“. Solche Funktionen sollten dokumentieren, was sie bedeuten; Wenn dies nicht der Fall ist, müssen Sie sich den Code ansehen.
Die gebräuchlichsten Bedeutungen sind jedoch "hat read(size)
", "hat read()
" oder "ist eine Iteration von Zeichenfolgen", aber einige alte Bibliotheken erwarten möglicherweise readline
anstelle einer dieser, einige Bibliotheken mögen close()
Dateien, die Sie ihnen geben, andere erwarten dies, wenn fileno
vorhanden ist, dann sind andere Funktionen verfügbar usw. Und ähnlich für write(buf)
(obwohl es in dieser Richtung viel weniger Optionen gibt).
why
was Operatoren wie__add__
,__lshift__
oder__or__
in benutzerdefinierten Klassen? ( Dateiobjekt und API: docs.python.org/glossary.html#term-file-object )