2014-05-16 30 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