Игнорировать исключение Python и сразу продолжить после него в коде субмодуля - PullRequest
1 голос
/ 01 июня 2019

Я использую библиотеку python, которая выдает исключение, о котором известно, что оно неверно. Фактически, недавние запросы на извлечение предлагают просто удалить строку, которая выдает исключение.

Есть ли способ заставить код Python продолжать игнорировать исключение, не прерывая код подмодуля? Встраивание библиотечного вызова в блок исключений не помогает, потому что последующий код не будет выполнен.

Я мог бы самостоятельно объединить запрос на выборку и установить пользовательскую версию библиотеки, но это нарушает весь процесс развертывания / зависимости / обновления.

Код, который я хочу игнорировать, состоит из этих двух строк:

if '<img class="icon meh" src="/yts/img' not in self.watch_html:
    raise VideoUnavailable('This video is unavailable.')

из этого файла , который был исправлен этим коммитом в этом pr .

1 Ответ

1 голос
/ 01 июня 2019

Я не думаю, что это возможно, и даже если бы это было так, я полагаю, что это будет только меньше поддерживаемым.

Я думаю, что лучшим решением в этом случае было бы создание подкласса и переопределение рассматриваемой функции.Недостатки в том, что если вы обновляете библиотеку, вам также необходимо обновить функцию, пока проблема не будет решена полностью.Это может выглядеть так, удалив строки исключений, используя код, который вы связали с pytube :

from pytube import Caption
from pytube import CaptionQuery
from pytube import extract
from pytube import mixins
from pytube import request
from pytube import Stream
from pytube import StreamQuery
from pytube.compat import install_proxy
from pytube.compat import parse_qsl
from pytube.exceptions import VideoUnavailable
from pytube.helpers import apply_mixin

from pytube import YouTube


class MyYouTube(YouTube):
    # https://github.com/nficano/pytube/blob/master/pytube/__main__.py#L150
    def prefetch(self):
        """Eagerly download all necessary data.

        Eagerly executes all necessary network requests so all other
        operations don't does need to make calls outside of the interpreter
        which blocks for long periods of time.

        :rtype: None

        """
        self.watch_html = request.get(url=self.watch_url)
        self.embed_html = request.get(url=self.embed_url)
        self.age_restricted = extract.is_age_restricted(self.watch_html)
        self.vid_info_url = extract.video_info_url(
            video_id=self.video_id,
            watch_url=self.watch_url,
            watch_html=self.watch_html,
            embed_html=self.embed_html,
            age_restricted=self.age_restricted,
        )
        self.vid_info = request.get(self.vid_info_url)
        if not self.age_restricted:
            self.js_url = extract.js_url(self.watch_html, self.age_restricted)
            self.js = request.get(self.js_url)

#YouTube('https://www.youtube.com/watch?v=irauhITDrsE').streams.first().download()  # Doesnt work
MyYouTube('https://www.youtube.com/watch?v=irauhITDrsE').streams.first().download() # Works

В зависимости от языка программирования это не всегда возможно из-завидимость.К счастью, Python не сильно волнует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...