Обработка исключений в коде, не зависящем от версии - PullRequest
0 голосов
/ 16 мая 2018

У меня есть простая задача под рукой ... обработка исключения, поэтому код не выдает IncompleteRead при использовании urllib / urllib2 между python2.x / 3.x

для python2

try:
    page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead, e:
    page = e.partial

для python3

try:
    page = request.urlopen(urls).read()
except (http.client.IncompleteRead) as e:
    page = e.partial

Теперь, поскольку сам модуль отличается, как сделать попытку, кроме случаев, когда я не знаю, какую версию Python будут использовать мои пользователи?

Я не могу проверить версию Python в моей попытке, кроме как ... или я могу?

есть ли способ поймать его суперкласс, чтобы он стал одинаковым для обеих версий Python? если да, то как?

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Если вам не нужен Python 2.5, вы можете использовать новый стиль, кроме: операторов в 2.x.

Таким образом, единственным отличием являются имена модулей.Вы можете try оба вручную, как в Сроу ответ .Но вам, вероятно, следует использовать six, futurize или modernize, как рекомендуют официальные документы по портированию и большинство других руководств по двойному версионированию и портированию, и это именно то, чтоони хороши для.


С six.moves:

from six.moves import http_client
from six.moves import urllib_request

try:
    page = urllib_request.urlopen(urls).read()
except http_client.IncompleteRead as e:
    page = e.partial

Или с future:

from future import standard_library
standard_library.install_aliases()
import http.client
import urllib.request, urllib.error, urllib.parse

try:
    page = urllib.request.urlopen(urls).read()
except http.client.IncompleteRead as e:
    page = e.partial

Или, что еще лучше, просто напишите код 2.7:

import httplib
import urllib2

try:
    page = urllib2.urlopen(urls).read()
except httplib.IncompleteRead as e:
    page = e.partial

… затем запустите на нем futurize, и он автоматически даст вам код future выше.

0 голосов
/ 16 мая 2018

Вы можете попробовать ... за исключением импорта в модуле init , а затем разбить ваш код на модули python2 и python3:

try:
    import urllib2
    pyver2()
except ModuleNotFoundError:
    import requests
    pyver3()

О, запрос не делает то, что вы хотите, возможно, вы имеете в виду «запросы», а запросы не имеют метода «urlopen», который вам нужно использовать «get ()».

0 голосов
/ 16 мая 2018

Вы можете:

try:
    from httplib import IncompleteRead
    import urllib2 as httpclient
except ImportError:
    from http.client import IncompleteRead
    import request as httpclient

Тогда используйте:

try:
    page = httpclient.urlopen(urls).read()
except IncompleteRead as e:
    page = e.partial

как в python2, так и в python3.

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