Найти - Пользователи
Полная версия: автоимпорт имен
Начало » Python для экспертов » автоимпорт имен
1 2 3 4
Evg
В пхп есть такая штука автозагрузка классов, идея в том что в одном месте описывается какой файл нужно заинклудить имея определенное имя класса (в файле содержится описание класса), а потом просто идет обращение к классу и все автоматом инклудится, есть ли что подобное в питоне для авто импорта модулей или какие варианты реализаций?
Ferroman
1. php - не питон
2. Что именно хочется сделать? На примере, пожалуйста.
3. Чем стандартный импорт не угодил?
Evg
Ferroman
3. Чем стандартный импорт не угодил?
Хотелось чтобы это выполнялось автоматически а не обезьянить вручную, из файла в файл десятками одни и теже импорты.

Раз не очевидно вот пример:
имеем N файлов в обоих используется по Х классов импортируемых с разных мест. вместо описания в кажом из N файлов по X однотипных импортов все это описывается в одном месте и далее напрямую в коде обращаемся к классам.

Ferroman
1. php - не питон
Это тут обсалютно не причем.
expee
Честно говоря бредовая идея. Может попробовать с помощью __import__? http://docs.python.org/library/functions.html#__import__ Кладешь имена всех нужных модулей в файл, где нужно его читаешь и импортируешь с помощью __import__

ps. когда в питоне что-то не получается сделать по простому - может ты не в ту сторону движешься?
Evg
expee
Честно говоря бредовая идея.
аргументируй свое утверждение насчет бредовости.

expee
ps. когда в питоне что-то не получается сделать по простому - может ты не в ту сторону движешься?
по твоему тупо из файла в файл повторят код - это проще чем не делать это?

ps. когда где-то принято и написано делать именно так а не иначе, не стоит молится на это.
Андрей Светлов
Что-то у меня всегда так получается, что список нужных импортов для каждого модуля - разный.
Идея писать их каждый раз заново ни разу не напрягает. Тем более что можно импортировать, например, иногда модуль а в другом случае имя из этого модуля.

Думаю, что попытка импортировать все скопом приведет к форменному бардаку. Но при сильном желании делается легко:
import_all.py
from os.path import abspath, dirname, join
from logging import getLogger
# ....
some_somule.py
from all_modules import *
Согласен, идея плохая и не рекомендуемая. Трудно будет читать код после, возможны интересные side-effects. Но если очень хочется - стоит попробовать. Чтобы набить себе необходимый комплект шишек и через время вернуться к тому, что используют люди во всем мире.
Ferroman
Явное - лучше неявного.
Простое - лучше сложного.

Честно - не понимаю, в чём проблема, и почему это вообще “проблема”.
Если вы из файла в файл повторяете код, да ещё и так часто, что это уже напрягает - значит у вас фундаментально что-то не так.
Evg
Ferroman
Если вы из файла в файл повторяете код, да ещё и так часто, что это уже напрягает
а у вас нет таких классов которые везде переиспользуются и импорты не повторяются, все в каждом файле с нуля переписываете, и это не напрягает, копи-пастить вам проще? (DRY) зачем повторять если можно избавится от повторений?, явное\неявное это без фанатизма никакой сложности чтобы вынести логику по определению импорта в отдельное место нет и она там объявлена будет вполне явно. Лично меня напрягает каждый раз лезть к верху файла вспомнить где расположен класс писать к нему путь я хочу чтобы это делалось автоматом, а по нужности указывать явно.

Андрей Светлов
Согласен, идея плохая и не рекомендуемая. Трудно будет читать код после, возможны интересные side-effects. Но если очень хочется - стоит попробовать. Чтобы набить себе необходимый комплект шишек и через время вернуться к тому, что используют люди во всем мире.
Имхо вся это проблема решается просто тем что нужно помнить что есть модуль который делает автоимпорт и там все вполне явно объявлено, а если нужно перекрыть имя своим импортом в ручную и все. На самом деле идея схожа с такими паттернами как registry или factory - это глобальные точки для хранения\создания объектов по некоторому ключу, тут по этому ключу делается немного другая задача - импорт.

По поводу этих паттернов же не возникает мысль что это дурная идея? На мой взгляд прямая аналогия.
Ferroman
Это, наверное, прозвучит странно, но классов которые ВЕЗДЕ переиспользуются - нет, таких нету. Так что копипастить - не приходится.
Я, честно говоря, затрудняюсь даже придумать когда так может получится.
Явное - всегда лучше неявного, даже, если страдает DRY (кстати, чего быть не может ибо этот принцип относится только именно к коду, к действующему, не к любой строчке текста программы. Смысл не в том что бы не повторять строчки).
Так что проблема диковато звучит, надуманно я бы сказал.
Evg
Ferroman
Явное - всегда лучше неявного, даже, если страдает DRY
Слово лучше, бредовые это конечно круто, но давайте более аргументировано)

даже если скажем в той же джанге тысячу и один раз из проекта в проект повторять дикие импорты типа
from django.contrib.contenttypes.models import ContentType
которые постоянно завязывают одно имя на один и тот же класс? тут явное повторение тоже лучше? чем оно вам лучше помнить и держать перед глазами этот бессмысленый код, и кучу строчек из таких длинющих импортов?

Ferroman
кстати, чего быть не может ибо этот принцип относится только именно к коду, к действующему, не к любой строчке текста программы.
а импорты это не дествующий код? есть не действующие строчки текста программы?

Ferroman
Смысл не в том что бы не повторять строчки
А в чем смысл?) в том что это “круто” или “лучше” ?)

ps. и кстати еще один + в пользу этого метода в том что можно мониторить все импорты с одного места - большая управляемость.

И кстати даже есть какой-то http://docs.python.org/library/sys.html#sys.meta_path
собственно если это плохая идея зачем эта фича в питоне)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB