Сократить импорт Python? - PullRequest
       1

Сократить импорт Python?

0 голосов
/ 19 ноября 2009

Я работаю над проектом Django. Давайте назовем это myproject. Теперь мой код замусорен myproject.folder.file.function. Могу ли я в любом случае убрать необходимость префикса ко всем моим импортам и тому подобное с myproject.? Что если я захочу переименовать свой проект позже? Это отчасти раздражает меня тем, что мне нужно ставить такие префиксы, когда тот самый файл, из которого я его импортирую, находится внутри того же проекта. Не должно быть необходимости.

Ответы [ 3 ]

5 голосов
/ 19 ноября 2009

from myproject.folder import file (ужасное имя, кстати, попирание над встроенным типом file, но это еще одна напыщенная речь ;-), затем используйте file.function - если file (должен ненавидеть , что имя модуля ;-) все еще слишком длинно для вас, добавьте, например, as fi в оператор from и используйте fi.function. Если вы хотите переименовать myproject в myhorror, вам нужно только прикоснуться к операторам from, адресовавшим его (вы могли бы использовать относительный импорт, но это нарушило бы совместимость 2.5 и, следовательно, запретило бы вам App Engine на данный момент - слишком высокая цена, чтобы платить за незначительное удобство, по крайней мере для меня; -).

Редактировать : если примерно каждому файлу требуется какой-то данный модуль поддержки, это веская причина для того, чтобы убедиться, что модуль поддержки находится в каталоге (или zipfile), который находится в sys.path (это, вероятно, стоит сделать даже если, скажем, только 30% файлов нуждаются в этом поддерживающем модуле! -).

3 голосов
/ 19 ноября 2009
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')

Для получения дополнительной информации об импорте читайте: Импорт модулей Python

1 голос
/ 19 ноября 2009

Если вы не возражаете против стука файла:

from myproject.folder import file

Если вы хотите сделать файл более коротким:

import myproject.folder.file as f 

Вы могли бы создать свой собственный оператор импорта, если вы действительно хотели:

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:

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.

На самом деле, я преувеличиваю зло, из-за которого стучат встроенные функции. Это не так уж плохо. Но это немного волосато.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...