我会在哪里为一个类导入urllib2?

时间:2010-02-05 07:52:10

标签: python coding-style module

我有一个需要访问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()

我应该如何构建我的代码,使其成为最pythonic :)?

3 个答案:

答案 0 :(得分:4)

您应该在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

在我看来,这是进口进口的最佳做法。

答案 1 :(得分:2)

我的一般经验法则是,如果文件中的许多内容使用了导入,我会把它放在最顶层。如果它仅由一个单一功能或一个单一范围使用,我会将它放在它所使用的位置,比如在类或函数中。

然而,这不是一个严格的规则,我不会花很多时间考虑通常进口的最佳位置。大多数情况下,我把它们放在最顶层。

我喜欢将进口靠近我使用它的两个最大原因是:

  • 如果函数导入了它需要的东西,那么我可以轻松地将该代码剪切并粘贴到另一个文件中,比如用于测试目的,或者它是像我的“catch和syslog”这样的样板代码。代码“code。

  • 如果不经常使用某个功能,或者需要一个通常不会为不经常使用的部件安装的模块,我不必在不使用它时导入它或者要求用户安装一个模块

答案 2 :(得分:0)

classimport都是普通的Python指令,没有魔法附加(好吧,有些事情发生在幕后,但它们只是简单的Python指令)。

Python从上到下遍历你的源代码,按照它的方式执行每条指令 - 无论是class指令为类创建新对象,还是import指令导入新模块进入当前范围。

此外,因为import指令和其他指令一样好,所以你可以把它放在class里面 - 你可以像想象目录里面的.py文件一样考虑类 - 在后一种情况下,您可能习惯于import可以直接放在.py文件的主范围内。

写下所有这些,我不确定你想通过将它添加到你的课程中来实现:

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

- 在创建类时解析此指令,然后该类的所有对象共享相同的myStringHtml值。

关于放置导入urllib2的最佳位置的问题,我也不太明白这个问题,但对我来说这样做似乎最自然:

    import foo

    # then foo.py contains
    import urllib2

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