Проверьте, подобен ли объект файлу в Python

Если Вы конкретно не ловите исключение, оно подброшено стек, пока что-то не делает

86
задан dmeister 2 November 2009 в 13:27
поделиться

5 ответов

Как правило, вообще не рекомендуется включать подобные проверки в свой код, если только вы есть особые требования.

В Python типизация является динамической, почему вы чувствуете необходимость проверять, похож ли объект на файл, а не просто использовать его, как если бы он был файлом, и обрабатывать полученную ошибку?

Любая проверка, которую вы можете сделать, в любом случае будет происходить во время выполнения, поэтому выполнение чего-то вроде , если не hasattr (fp, 'read') и вызов некоторого исключения дает немного больше полезности, чем просто вызов fp .

47
ответ дан 24 November 2019 в 07:59
поделиться

Как уже говорили другие, вам следует избегать таких проверок. Одно исключение - это когда объект может быть разных типов, и вам нужно различное поведение в зависимости от типа. Метод EAFP не всегда работает здесь, поскольку объект может выглядеть как более одного типа уток!

Например, инициализатор может принимать файл, строку или экземпляр своего собственного класса. Тогда у вас может быть такой код:

class A(object):
    def __init__(self, f):
        if isinstance(f, A):
            # Just make a copy.
        elif isinstance(f, file):
            # initialise from the file
        else:
            # treat f as a string

Использование EAFP здесь может вызвать всевозможные тонкие проблемы, поскольку каждый путь инициализации частично запускается перед выдачей исключения. По сути, эта конструкция имитирует перегрузку функций и поэтому не очень похожа на Pythonic, но при осторожном использовании она может быть полезна.

В качестве примечания: вы не можете выполнять проверку файлов таким же образом в Python 3. Вы ' Вместо этого мне понадобится что-то вроде isinstance (f, io.IOBase) .

45
ответ дан 24 November 2019 в 07:59
поделиться

Доминирующая парадигма здесь - EAFP: проще просите прощения, чем разрешения. Продолжайте и используйте файловый интерфейс, а затем обработайте полученное исключение или позвольте им распространиться на вызывающую программу.

26
ответ дан 24 November 2019 в 07:59
поделиться

Вы можете попробовать вызвать метод, а затем поймать исключение:

try:
    fp.read()
except AttributeError:
    raise something

Если вам нужен только метод чтения и записи, вы можете сделать это:

if not (hasattr(fp, 'read') and hasattr(fp, 'write')):
   raise something

На вашем месте я бы пошел с помощью метода try / except.

6
ответ дан 24 November 2019 в 07:59
поделиться

В большинстве случаев лучший способ справиться с этим - не делать этого. Если метод принимает объект, подобный файлу, и оказывается, что переданный объект им не является, исключение, которое возникает, когда метод пытается использовать объект, не менее информативно, чем любое исключение, которое вы могли вызвать явно.

Тем не менее, есть по крайней мере один случай, когда вы можете захотеть выполнить такого рода проверку, и это когда объект не используется немедленно тем, кому вы его передали, например, если он установлен в конструкторе класса. В таком случае я бы подумал, что принцип EAFP превосходит принцип «быстро выходить из строя». Я бы проверил объект, чтобы убедиться, что он реализует методы, которые нужны моему классу (и что они методы), например:

class C():
    def __init__(self, file):
        if type(getattr(file, 'read')) != type(self.__init__):
            raise AttributeError
        self.file = file
2
ответ дан 24 November 2019 в 07:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: