LINUX.ORG.RU

[python][недоумение]Импортировать все файлы модуля так и не?!

 ,


0

0

Что ж это делается, в третьем Питоне до сих пор при импорте модуля-директории его файлы автоматически не импортируются?! Например, у меня есть:

директория МойМодуль, в ней, по обычаю, файл __init__, и пачка файлов с классами.

Пишу import МойМодуль, а файлы-то не импортируются. Либо импортируй каждый отдельно (дичь), либо пиши функционал, который в Перле из коробки, между прочим.

Пока что написал свой велосипед, но не оставляю надежды, что все же я что-то пропустил. Пожалуйста, верните мне веру в человечество.

★★★

Ответ на: комментарий от baverman

То есть таки невозможно. А каноническое какое-нибудь решение есть?

Gukl ★★★
() автор топика
Ответ на: комментарий от baverman

Занятно, что import package.file и from package import * к тому же дают разные результаты. Воистину, Питон велик.

Gukl ★★★
() автор топика

В ините напиши импорты из всех файлов класса. Что-то типа такого:

$ls mypack
__init__.py a.py b.py c.py

$cat mypack/__init__.py
from a import A1, A2
from b import B1, B2
from c import C1, C3

provaton ★★★★★
()
Ответ на: комментарий от provaton

Написать-то я написал (только универсальней, я сделал импорт всего из всех модулей в директории, так как мне нужно, чтобы он тупо импортировал все что найдет, а не конкретно указанные классы). Еще класс imp хорош, может попозже с ним перепишу. Но это , конечно, жесть...

Gukl ★★★
() автор топика
Ответ на: комментарий от provaton

Да не трагедия, а привычка к Перлу. Все ж писать свой загрузчик в интерпретируемом языке как-то не кошерно. Ну и вообще, думал, пофиксят, а объявили фичей ;)

Gukl ★★★
() автор топика
Ответ на: комментарий от tailgunner

> Это фича. Представь, что тебе _не нужно_ импортировать всё из всех файлов пакета.

Представил... Хорошо! Вернулся в реальность -- таки нужно ;) Не все из всех, а все _модули_ пакета, кстати. Все из всех как раз не должно автоматом литься.

Gukl ★★★
() автор топика
Ответ на: комментарий от tailgunner

> Представь, что тебе _не нужно_ импортировать всё из всех файлов пакета.

И, кстати, нафига мне в таком случае нужен импортированный _пустой_ пакет?

Gukl ★★★
() автор топика
Ответ на: комментарий от friday

> Ну так и пиши на перле, в чём проблема-то?

Ну так не один пишу.

Gukl ★★★
() автор топика
Ответ на: комментарий от sobrano_bez_parity

> Ты хочешь странного.

Я хочу _очевидного_, вообще-то ;) Доку прочел в первую очередь.

Gukl ★★★
() автор топика
Ответ на: комментарий от YogSagot

Ну или посканировать всю окресную директорию и импортировать все найденный файлы, еще удобней (при добавлении новых не надо ничего переписывать). Я так сделал.

Gukl ★★★
() автор топика
Ответ на: комментарий от provaton

Обычно нужно импортировать хоть что-то, а import Package не импортирует вообще ничего. Дзенский подход такой.

Опять же, за всех не говорю, но мне обычно надо свои модули импортировать все. Какой мне смысл для конкретной программы писать модуль, который никогда в ней не используется?

Gukl ★★★
() автор топика
Ответ на: комментарий от tailgunner

> Это фича. Представь, что тебе _не нужно_ импортировать всё из всех файлов пакета.

Ох уж эти иллюзионисты-питонщики... Вместо того, чтобы сделать как в Лиспе, они воображение развивают...

mv ★★★★★
()
Ответ на: комментарий от Gukl

> Какой мне смысл для конкретной программы писать модуль, который никогда в ней не используется?

Просто есть сугубо внутренние классы, функции и переменные, которые незачем другим модулям.

provaton ★★★★★
()
Ответ на: комментарий от Gukl

Интересно посмотреть на код, который использует ВСЕ модули пакета.

Ну или посканировать всю окресную директорию и импортировать все найденный файлы, еще удобней (при добавлении новых не надо ничего переписывать). Я так сделал.

Также интересно, сколько модулей в пакете и как часто они появляются.

$ cat __init__.py

import os.path
import glob

MODULE_DIR = os.path.abspath(os.path.split(__file__)[0])

modules = ( os.path.splitext(os.path.basename(m))[0]
    for m in glob.glob(os.path.join(MODULE_DIR, '*.py')) )

__all__ = [m for m in modules if m != '__init__']
baverman ★★★
()
Ответ на: комментарий от baverman

> Интересно посмотреть на код, который использует ВСЕ модули пакета.

Пакет написан специально для этого кода, есествено, нужен целиком. Кстати, спасибо за пример - я-то решил, что переменную __all__ динамически заполнять рискованно.

Gukl ★★★
() автор топика
Ответ на: комментарий от mv

> Вместо того, чтобы сделать как в Лиспе, они воображение развивают...

ИМХО, Лиспом Гвидо вдохновлялся, есть легкое сходство. "Лямбда", декораторы...

Gukl ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.