Куда мне импортировать urllib2 для класса? - PullRequest
1 голос
/ 05 февраля 2010

У меня есть класс, которому нужен доступ к urllib2, тривиальный пример для меня:

class foo(object):
    myStringHTML = urllib2.urlopen("http://www.google.com").read()

Как мне структурировать мой код, чтобы включить urllib2? В общем, я хочу хранить foo в служебном модуле с рядом других классов и иметь возможность самостоятельно импортировать foo из модуля:

from utilpackage import foo

Правильный ли стиль для импорта в класс? Это кажется странным для меня, но это работает ....

class import_u2_in_foo(object):
    import urllib2
    myStringHtml = urllib2.urlopen("http://www.google.com").read()

Или я должен переместить foo в другой пакет, чтобы я всегда использовал

import foo
# then foo.py contains
import urllib2
class foo(object):
    myStringHtml = urllib2.urlopen("http://www.google.com").read()

Как мне структурировать мой код здесь, чтобы он был наиболее питоническим?)?

Ответы [ 3 ]

4 голосов
/ 05 февраля 2010

Вы должны импортировать его в модуль utilpackage, но экспортировать из него только класс foo:

import urllib2

__all__ = ["foo"]

class foo(object):
    myStringHtml = urllib2.urlopen("http://www.google.com").read()

Тогда вы можете сделать

from utilpackage import foo

но не

from utilpackage import urllib2

На мой взгляд, это лучшая практика для импорта из-за рубежа.

2 голосов
/ 05 февраля 2010

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

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

Две главные причины, по которым я хотел бы, чтобы импорт был ближе к тому, где я их использую:

  • Если функция импортирует то, что ей нужно, я могу легко вырезать и вставить этот код в другой файл, скажем, для целей тестирования или, если это стандартный код, такой как мой "catch и syslog, любые исключения, которые происходят в этом код "код.

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

0 голосов
/ 05 февраля 2010

И class, и import - это обычные инструкции Python, в которых нет никакой магии (ну, некоторые вещи происходят под капотом, но, тем не менее, это просто хорошие хорошие инструкции Python).

Python просматривает ваш исходный код сверху вниз, выполняя каждую инструкцию по своему пути - независимо от того, является ли это инструкция class, которая создает новый объект для класса, или инструкция import, которая импортирует новый модуль в текущую область.

Более того, поскольку инструкция import такая же хорошая, как и любая другая, вы можете просто поместить ее в class - вы можете думать о классах так же, как вы думаете о файлах .py внутри каталогов - и в последнем Если вы, вероятно, привыкли к этому, import может быть помещен непосредственно в основную область .py файла.

Записывая все это, я не уверен, чего бы вы хотели достичь, добавив это в свой класс:

   myStringHtml = urllib2.urlopen("http://www.google.com").read()

- эта инструкция анализируется при создании класса, а затем все объекты класса совместно используют одно и то же значение myStringHtml.

Что касается вопроса о наилучшем месте для импорта import urllib2, я также не совсем понимаю проблему, но для меня наиболее естественным представляется сделать это следующим образом:

    import foo

    # then foo.py contains
    import urllib2

    class foo(object):
         myStringHtml = urllib2.urlopen("http://www.google.com").read()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...