En règle générale, vous n'avez pas besoin de vérifier un type d'objet, vous pouvez utiliser f.read()
directement et laisser les exceptions possibles se propager - c'est soit un bug dans votre code ou un bug dans le code appelant par exemple, json.load()
lève AttributeError
si vous lui donnez un objet qui n'a pas d'attribut read
.
Si vous devez distinguer plusieurs types d'entrée acceptables; vous pouvez utiliser hasattr/getattr
:
def read(file_or_filename):
readfile = getattr(file_or_filename, 'read', None)
if readfile is not None: # got file
return readfile()
with open(file_or_filename) as file: # got filename
return file.read()
Si vous souhaitez prendre en charge un cas où file_of_filename
peut avoir read
attribut est réglé sur None
alors vous pouvez utiliser try/except
plus file_or_filename.read
- Note: aucun parens, l'appel ne se fait pas - - Par exemple, ElementTree._get_writer()
.
Si vous voulez vérifier certaines garanties, par exemple, qu'un seul appel système est fait (io.RawIOBase.read(n)
pour n> 0) ou il n'y a pas de court écrit (io.BufferedIOBase.write()
) ou si les méthodes de lecture/écriture acceptent des données textuelles (io.TextIOBase
) puis vous pouvez utiliser la fonction isinstance()
avec ABCs defined in io
module par exemple, look at how saxutils._gettextwriter()
is implemented.
Mon Python 2.6.5 renvoie la valeur True pour isinstance (f, file), lorsque f = open ('filepath', 'r') et False pour f = ''. Je commence à penser que quelque chose d'autre pourrait être le problème ici – inspectorG4dget
Les [docs actuels] (http://docs.python.org/library/functions.html#file) mentionnent en fait que l'utilisation principale de 'file' est que c'est "plus approprié \ [que' open'] de taper des tests (par exemple, écrire 'isinstance (f, fichier))' ". – intuited
J'ai conclu que v3.x est cassé. – theDoctor