Pour 3.1+, l'un des éléments suivants:
isinstance(something, io.TextIOBase)
isinstance(something, io.BufferedIOBase)
isinstance(something, io.RawIOBase)
isinstance(something, io.IOBase)
Pour 2.x, "objet semblable à un fichier" est une chose trop vague à vérifier, mais la documentation de la ou des fonctions auxquelles vous avez affaire vous dira avec un peu de chance ce dont elles ont réellement besoin; sinon, lisez le code.
Comme le soulignent d'autres réponses, la première chose à demander est ce que vous recherchez exactement. Habituellement, l'EAFP est suffisant et plus idiomatique.
Le glossaire dit que "objet de type fichier" est un synonyme de "objet fichier", ce qui signifie finalement qu'il s'agit d'une instance de l'une des trois classes de base abstraites définies dans le io
module , qui sont elles-mêmes toutes des sous-classes de IOBase
. Donc, la façon de vérifier est exactement comme indiqué ci-dessus.
(Cependant, la vérification IOBase
n'est pas très utile. Pouvez-vous imaginer un cas où vous devez distinguer une fonction semblable à un fichier read(size)
d'une fonction à un argument nommée read
qui n'est pas semblable à un fichier, sans avoir également besoin de faire la distinction entre les fichiers texte et raw Donc, vraiment, vous voulez presque toujours vérifier, par exemple, "est un objet de fichier texte", et non "est un objet de type fichier".)
Pour 2.x, alors que le io
module existe depuis 2.6+, les objets de fichier intégrés ne sont pas des instances de io
classes, aucun des objets de type fichier dans la stdlib non plus, ni la plupart des objets de type fichier tiers que vous sont susceptibles de rencontrer. Il n'y avait pas de définition officielle de ce que signifie «objet semblable à un fichier»; c'est juste "quelque chose comme un objet de fichier intégré ", et différentes fonctions signifient des choses différentes par "comme". Ces fonctions devraient documenter ce qu’elles signifient; s'ils ne le font pas, vous devez regarder le code.
Cependant, les significations les plus courantes sont «a read(size)
», «a read()
» ou «est une itérable de chaînes», mais certaines anciennes bibliothèques peuvent s'attendre à la readline
place de l'une de celles-ci, certaines bibliothèques aiment les close()
fichiers que vous leur donnez, d'autres s'attendent à ce que si fileno
est présente alors d'autres fonctionnalités sont disponibles, etc. Et de même pour write(buf)
(bien qu'il y ait beaucoup moins d'options dans cette direction).
why
qu'en est-il des opérateurs comme__add__
,__lshift__
ou__or__
dans des classes personnalisées? (objet de fichier et API: docs.python.org/glossary.html#term-file-object )