2012-09-10 30 views
2

我創建了一個名爲金字塔項目目錄「模型」文件夾,並把我所有的車型有不同的文件,如:如何在金字塔中導入時縮短路徑?

models 
    |------ User.py 
      |------- class User 
    |------ Group.py 
      |------- class Group 

在像initializedb.py一些腳本,我不得不寫類似

from ..models.User import User 
from ..models.Group import Group 

這是非常醜陋的。如何縮短「時間

from ..models import User 
from ..models import Group 

不添加冗餘的東西像

from .User import User 
from .Group import Group 
在模型

/初始化的.py?

+0

你爲什麼把每個類在一個單獨的文件?通常沒有理由在Python中執行此操作。 – BrenBarn

+2

僅僅因爲你沒有*在Python中爲每個模塊創建一個類並不意味着它不是管理大量代碼的有效方式。 –

+0

是的,我這樣做是因爲它使我的項目更加清晰易懂。我恨一個包含所有內容的大文件.... :-( –

回答

3

做到這一點的唯一方法是通過models/__init__.py

from User import User 
from Group import Group 

這原來models成一個包,並允許您使用from ..models import User

建議一句話:標準做法是將所有小寫字母的模塊名稱和大寫保留爲類。這允許您同時將user模塊和User類同時放在同一個命名空間中,如果模塊包含用於處理類的便利功能,這可能非常方便。

+0

看來,我必須將所有模型放在一個文件中才能使我的代碼清理... :-(感謝您的建議! –

+3

您*可以*創建一個通用的'__init __。py'來遍歷文件夾樹中的所有Python文件併爲每個文件執行'import *',然後在每個文件中指定你可以通過定義'__all__'來導出哪些項目可以導出,但是我發現手動方式在很長的一段時間內更加靈活和容易理解。 –

+0

我對遍歷方式非常感興趣...可以你與我分享代碼? –

0

不幸的是,沒有任何方法可以做到你所要求的,而不需要在models/__init__.py中導入。或者,將所有模型包括在一個.py文件中,而不是爲每個文件分別創建一個.py文件。

對不起。

+0

如果我必須修改models/__init__.py,怎麼辦?謝謝 –

3

下面是一個粗糙的&髒兮兮的例子,你可能會自動化它。創建具有以下的__init__.py

import os 
import sys 
import glob 
import pkgutil 

def auto_importer(): 
    here = os.path.split(__file__)[0] 
    for _, package, _ in pkgutil.iter_modules([here]): 
     package_name = '%s.%s' % (here, package) 
     if package_name not in sys.modules: 
      __import__(package_name) 
      module = sys.modules[package_name] 
      public_members = (m for m in getattr(module, '__all__', dir(module)) if not m.startswith('__')) 
      for member in public_members: 
       globals()[member] = getattr(module, member) 

auto_importer() 

# clean up namespace to avoid these leaking out 
del os, sys, glob, pkgutil 
del auto_importer 

這將導入一切事情,從沒有與__前綴(所以我們不從每個模塊的所有特殊屬性拉,像__file__)每個包含的模塊。如果你只是想從你的group模塊導入,比方說,Group類,你會添加一行group.py如下:

__all__ = [ 'Group' ]