缩短Python导入?

mpe*_*pen 1 python django

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

Ale*_*lli 5

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

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

  • "myproject"为"myhorror"的+1,但我认为OP只是说"myproject.folder_in_myproject.specific_file_in_my_project.function_I_want",而不是实际上有一个他/她导入的`file.py`文件. (2认同)

wis*_*sty 5

如果您不介意破坏文件:

from myproject.folder import file
Run Code Online (Sandbox Code Playgroud)

如果你想让文件更短:

import myproject.folder.file as f 
Run Code Online (Sandbox Code Playgroud)

如果您真的很喜欢,您可以创建自己的导入声明:

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')
Run Code Online (Sandbox Code Playgroud)

你也可以彻底邪恶,破解内置的 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.
Run Code Online (Sandbox Code Playgroud)

事实上,我夸大了破坏内置函数的危害。它没有那么坏。但它有点毛茸茸的。

  • 它实际上“确实”听起来非常邪恶。努力+1,但我永远不会采取这种方法。 (2认同)