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 la version 2.x, l'expression "objet de type fichier" est trop vague pour être vérifiée, mais la documentation de la ou des fonctions auxquelles vous avez affaire devrait vous indiquer ce dont elles ont besoin ; sinon, lisez le code.
Comme le soulignent d'autres réponses, la première chose à demander est de savoir ce que l'on cherche exactement. Habituellement, EAFP est suffisant, et plus idiomatique.
Le glossaire indique que "file-like object" est un synonyme de "file object", ce qui signifie en fin de compte qu'il s'agit d'une instance de l'un des trois types d'objets suivants classes de base abstraites défini dans le site io
module qui sont elles-mêmes des sous-classes de IOBase
. Donc, la façon de vérifier est exactement comme indiqué ci-dessus.
(Toutefois, la vérification IOBase
n'est pas très utile. Pouvez-vous imaginer un cas où vous auriez besoin de distinguer un fichier réel, par exemple read(size)
à partir d'une fonction à un argument nommée read
qui ne ressemble pas à un fichier, sans avoir à faire la distinction entre les fichiers texte et les fichiers binaires bruts ? Donc, en réalité, vous voulez presque toujours vérifier, par exemple, "est un objet de type fichier texte", et non "est un objet de type fichier").
Pour la version 2.x, alors que le io
existe depuis la version 2.6+, les objets fichiers intégrés ne sont pas des instances du module io
ni aucun des objets de type fichier de la stdlib, ni la plupart des objets de type fichier tiers que vous êtes susceptible de rencontrer. Il n'y a pas eu de définition officielle de ce que signifie "objet de type fichier" ; c'est simplement "quelque chose comme un objet intégré". Objet du fichier "et différentes fonctions ont des significations différentes de "like". Ces fonctions devraient documenter ce qu'elles signifient ; si elles ne le font pas, vous devez regarder le code.
Cependant, les significations les plus courantes sont "a read(size)
", "a read()
", ou "est un itérable de chaînes de caractères", mais certaines anciennes bibliothèques peuvent s'attendre à ce que readline
au lieu de l'un d'entre eux, certaines bibliothèques aiment à close()
fichiers que vous leur donnez, certains s'attendront à ce que si fileno
est présent, alors une autre fonctionnalité est disponible, etc. Et de même pour write(buf)
(bien qu'il y ait beaucoup moins d'options dans cette direction).