2014-05-16 29 views
0

因此,我有一个名为“Pants”的项目,它位于GitHub.com上。该项目最初是一个.py文件,名为pants.py如何避免我的代码用户输入冗余导入行?

Pants/ 
    pants.py 
    README.md 

和用户可以导入和使用它,如下所示:

import pants 
w = pants.World() 

这两种感觉没什么问题。然后,我就如何构建一个项目中读取了单元测试包括在内,并初步重组我的项目正是如此:

Pants/ 
    pants.py 
    README.md 
    test/ 
     __init__.py 
     test_world.py 
     test_ant.py 

这样做的问题是,虽然用户仍然可以导入相同的逻辑方式,没有pants.test模块/包!没问题,我想,我会简单地添加其他__init__.py文件:

Pants/ 
    __init__.py 
    pants.py 
    README.md 
    test/ 
     __init__.py 
     test_world.py 
     test_ant.py 

但现在进口觉得难以置信重复:

import Pants.pants 
w = Pants.pants.World() 

它只是感觉好像有一个更好的办法!现在,我的项目的结构是这样的:

Pants/ 
    README.md 
    pants/ 
     __init__.py 
     ants.py 
     world.py 
     solver.py 
     test/ 
      __init__.py 
      test_world.py 
      test_ant.py 

然而,进口线的用户都面临着同样的重复:

import pants.world 
import pants.solver 
w = pants.world.World() 
s = pants.solver.Solver() 

现在我知道你可以别名这些东西短等价物,例如import pants.world.World as World,但导入线本身仍然是重复的。有关如何在保留适当项目结构的同时避免这种重复的建议?如果我想要通过pip来安装它,那么是否有这些变化?

+0

看看['ASYNCIO/__ __初始化py'。(HTTP://hg.python .ORG/CPython的/文件/ ae405c11193b /库/ ASYNCIO/__ init__.py)。如果'world.py'和'solver。py'是实现细节;您的用户可能会使用平面命名空间,即唯一的进口是'import pants' – jfs

+0

太棒了,谢谢!我以为我曾经在某处读过将代码放入'__init __。py'中是一种不好的做法,但是在查看asyncio是如何做的以及[this SO question]之后(http://stackoverflow.com/questions/5831148/why我知道到底如何继续:) – rhgrant10

回答

1

为了解决这个问题,我一直在我的包结构相同,并添加以下行pants/__init__.py

from .ant import Ant 
from .world import World 
from .solver import Solver 

然后我就能够改变进口线在我的演示文件的顶部:

from pants import World 
from pants import Solver 
+0

因为我没有提高对我的问题的回答的声望,并且由于我收到的帮助在技术上可以在链接中找到,所以我想我会明确回答我自己的问题。这样下一个有这个问题的人就可以直接看到我在不依赖链接内容的情况下解决我的问题所做的改变。 – rhgrant10

0

而不是单独的pants.py将该代码放入__init__.py。然后当有人做import pants它加载__init__.py。 (我会避免使用大写的“裤子”为大写通常是类名)

如果用户需要worldsolver分开,你也可以做

from pants import world,solver 
w = world.World() 
s = solver.Solver() 

如果他们想要的一切,从你的包,他们可以不要

from pants import * 
+1

不使用'__init __。py'或Python REPL – jfs

+0

以外的通配符导入是的最佳做法是不要导入所有内容。 – Cfreak