缩短Python导入?

时间:2009-11-19 04:53:34

标签: python django

我正在研究一个Django项目。我们称之为myproject。现在,我的代码充斥着myproject.folder.file.function。反正我是否可以删除所有导入前缀的必要性,如myproject.?如果我想稍后重命名我的项目怎么办?当我从它导入的文件在同一个项目中时,我需要为这样的东西添加前缀,这让我感到很恼火。不应该是必要的。

3 个答案:

答案 0 :(得分:5)

from myproject.folder import file(可怕的名字,顺便说一句,践踏内置类型file,但那是另一种咆哮;-),然后使用file.function - if file(gotta) 讨厌那个模块名称;-)对你来说还是太长了,添加例如对as fi语句from,并使用fi.function。如果你想将myproject重命名为myhorror,你只需触摸from语句来解决它(你可以使用相对导入,但那些会破坏2.5兼容性,因此暂时禁止你从App Engine - 太高了至少对我来说,为了方便而付出代价; - )。

编辑:如果几乎每个文件都需要一些给定的支持模块,这是确保支持模块位于sys.path上的目录(或zipfile)中的一个强有力的理由(它可能值得例如,即使只有30%的文件需要支持模块! - 。)。

答案 1 :(得分:3)

import x as y
import x.y as z
from x import y as z

“as”允许您为导入的模块指定自己的名称。例如,import os as System允许您像这样调用os模块的组件:

System.path.abspath('bla')

有关导入的详细信息,请阅读:Importing Python Modules

答案 2 :(得分:1)

如果你不介意破坏文件:

from myproject.folder import file

如果你想让文件更短:

import myproject.folder.file as f 

如果您感觉非常喜欢,可以创建自己的import语句:

head = 'myproject.folder.'
def my_import(name,*args,**kwargs):
   try:
       return __import__(name, *args, **kwargs)
   except ImportError: 
       return __import__(head+name, *args, **kwargs)

file = my_import('file')

你也可以是彻头彻尾的邪恶,并破解内置的python import语句:

head = 'myproject.folder.'

_import = __import__ # don't clobber __import__ yet

def my_import(name,*args,**kwargs):
   try: 
       return _import(name,*args,**kwargs)
   except ImportError:
       return _import(head+name, *args, **kwargs)

__builtins__.__import__ = my_import # God just killed a maintainer

# elsewhere, after the above abomination has run:
import file # I hope you are happy.

实际上,我夸大了破坏内置函数的邪恶。没那么糟糕。但它有点毛茸茸。