2009-12-27 122 views
1

在我工作的Python目录创建:为什么我不能调用packagename.modulename.foo()?

packagename/__init__.py 
packagename/modulename.py 
test.py 

在modulename.py我创造了一些空的类:

class Someclass(object): 
    pass 

在test.py:

import packagename 
packagename.modulename.Someclass() 

为什么我可以”在test.py中调用packagename.modulename.someclass()?

AttributeError: 'module' object has no attribute 'modulename' 

我的理解是正确的做法是:

import packagename.modulename 

from packagename import modulename 

但我不明白为什么我在我的情况下,出现此错误。

更新:

换句话说,有没有办法导入包的内容与在不同的命名空间中的所有模块? 我需要正确的Python的表达式为:

from packagename import * as mynamespace 

回答

1

如果“packagename”包中包含100个模块,那么当您只导入顶级名称时是否要自动导入它们?这通常不是一个好主意,所以Python不会这样做。

如果你想有一个特定的模块自动导入,只是将其包含在__init__.py像这样:

from packagename import modulename 

另外,使用Python 2.5或2.6:

from __future__ import absolute_import 
from . import modulename 

(在以后的版本中,你可以沟from __future__部分。)

编辑:有没有内置机制来要求Python在包内导入所有可能的子模块。这不是一个常见的用例,并且通过使您的__init__.py精确导入那些您想要的内容,可以更好地处理它。将某些东西放在一起可以完成这项工作(使用__import__()等),但在大多数情况下,只需按照所述的方式显式导入所有子模块就更好了。

+0

我需要在packagename/__ init_.py中列出所有软件包的模块,对不对? 我想我需要正确的python表达式“from packagename import * as mynamespace”。 – Alex 2009-12-27 22:14:41

+0

我认为这就是'将包名称导入mynamespace'。 – 2009-12-28 00:40:50

0

一些包是非常大的和进口的一切内他们将花费大量的时间。为进口提供精细的粒度会更好,因此用户只能导入他真正需要的内容。

2

Python不会自动递归并导入子包。当你说:

import packagename 

这就是所有它导入。如果你说:

import packagename.modulename 

然后第一进口packagename,然后导入packagename.modulenameassignes对它的引用作为packagename属性。因此,当你在代码中说:

packagename.modulename.Someclass() 

Python是只用100%正常属性查找。首先在当前命名空间中查找packagename变量。然后查找packagename对象的modulename属性。然后查找modulename对象的Someclass属性。

如果你忽略导入packagename.modulename,那么显然是packagename没有属性称为modulename,从今以后的AttributeError

我建议你弹出命令行并导入一些东西,然后用dir()来检查它。然后导入一个子包,并再次使用dir()。你会很快看到差异。


最后,语法:

from packagename.modulename import SomePackage 

在本质上是一样的:

import packagename.modulename 
SomePackage = packagename.modulename.SomePackage 

(当然,它的实现方式不同,但或多或​​少相同的结果)。

这有帮助吗?

+0

@gahooa:谢谢你的回答,但有什么办法可以从单独的命名空间中导入包中的所有模块吗?就像“import packagename。*” – Alex 2009-12-27 21:17:26

相关问题