LINUX.ORG.RU

Объясните разницу между import на python и include php

 , ,


0

3

Изучаю питон. Раньше писал на PHP.

В PHP вложенность наследуется (include в одном файле, подтянет все что уже инклудилось в другом и так далее). На питоне я попробовал разделить учебный проект на части и наступил на грабли: мне пришлось делать импорт некоторых модулей во все файлы, где они используются.

В чем фишка такого подхода и что я делаю не так?

Deleted

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

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

Deleted
()

В чем фишка такого подхода

Не засорять namespace. У каждого модуля своя область видимости.

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

есть правильный подход к разделению проекта на кусочки.

Это и есть правильный подход. Ты, впрочем, можешь сделать один модуль в котором есть всё что нужно для других модулей и потом делать from myimports import *, но лучше так не делать. Это кажется разумным только на маленьких проектах. Чуть что побольше и у тебя могут быть весёлые глюки из-за конфликта имён.

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

потом делать from myimports import *

PEP 8.

Deleted
()

есть правильный подход

разбивать на модули и импортировать их из главного модуля

buratino ★★★★★
()

include пришел со времен препроцессора C. В то время разрабов заломало сделать нормальную модульность, и они сообразили такой костыль: препроцессор вместо #include «myfile» тупо вставляет содержимое этого файла. Если инклюдишь другой файл, в котором тоже есть инклюд, то все они раскрываются, и компилятор/интерпретатор на вход получает от-такенный файл, в который слиты все исходники.

Никто не мешает включить абсолютно любой файл, хоть бинарник.

<?php
include '/usr/bin/php5';

Получится фигня, но ведь получится!

В питоне все сделано правильно, такой низкоуровщиной не заморачиваешься. Нужен модуль? Пиши require. Он никаких текстов никуда не вставляет, просто интерпретатор делает отметки, где нужно будет искать функции. Каждый файл отвечает только за себя, кого импортируют другие, для него абсолютно неважно.

anonymous
()

include это лютая пороша про которую нужно забыть, привыкай к барским импортам

umren ★★★★★
()

Не программист и могу ошибаться, но личный опыт где-то такой.

Питоновский import по своей логике больше похож на phpшный use, чем на include. То есть import подключает пространство имен, как и use на php.

include в php равносилен тому, что ты вставляешь кусок кода из одного файла в другой. Если не изменяет память, error_reporting даже может каверкать номер строки с ошибкой, если использован include. Не уверен, что в питоне есть аналогичная по логике команда.

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

include это лютая пороша про которую нужно забыть, привыкай к барским импортам

импортозамещение :)

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

Не уверен, что в питоне есть аналогичная по логике команда.

execfile

Virtuos86 ★★★★★
()

require тогда уж, а не include

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

Нужен модуль? Пиши require.

Зачем в век автозагрузки классов? Нужен модуль — оформляй в виде класса и грузи его файлы по запросу.

...

В последние года два в хорошей практике PHP нужен только _один_ require: для vendor/autoload.php :)

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

«Тридцать лет за рулем. У меня фиг проскочишь!»

Я кашу написал. Конечно же, имел в виду питона, что там в каждом файле пишутся собственные import-ы, только заглючил, и наклацал require.

Про автозагрузку — все верно. Еще бы встречаться исключительно с хорошими практиками, а не с легаси времен динозавров.

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

Еще бы встречаться исключительно с хорошими практиками, а не с легаси времен динозавров.

Вот большой бонус от composer'а в том, что он стимулирует переписывание либ. Сегодня вся чаще или либа есть в composer, или можно считать, что её нет :) Я последний раз стороннюю PHP-библиотеку вне composer использовал, дай Бог памяти, летом прошлого года.

Вот с чем пока в PHP в плане модульности не так шоколадно — это с assets. Всякие css/js/картинки. Хочется такого же функционала работы с зависимостями и подключением как с composer, но хорошего решения пока нет. Есть, конечно, bower/bowerphp, есть адаптации bower к composer, есть несколько вариантов asset-менеджеров на чистом composer, но всё это кривовато, ненадёжно и без мейнстрима.

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

стимулирует переписывание либ

Не то слово как стимулирует. И помогает навести порядок в зоопарке этих самых либ.

Без связки composer, bower, grunt, docker жизни больше не вижу.

Deleted
()
Ответ на: комментарий от x3al

Почему же, и npm тоже, без него никуда не деться. Bower и grunt через npm и ставятся. А композер убран в докер для удобства.

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

Съедобно в целом. devel-сервер с автообновлением удобен. Умеет bower, но больше заточен на npm-пакеты. Плюс можно вытаскивать имя файла бандла из bundle-tracker и вставлять в HTML, например.

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

Почему не npm

Как было выше сказано, npm юзается хотя бы для bower (хотя есть чистый bowerphp). Но вот сами пакеты под npm заточены под NodeJS и толку в PHP с них мало. Часто они вообще требуют сборки перед использованием. А bower ставит, как правило, чистые готовые assets.

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

Так он же юзает grunt как раз для сборки. Либо webpack, который собирает не хуже. Хотя с webpack поначалу кажется непривычным инклюдить css/less/sass/whatever прямо из js.

Собирать уже собранное в grunt не так выгодно, как собирать из исходника.

x3al ★★★★★
()

Главная разница в том, что в пайтоне есть система модулей, а в пхп есть костыльные инклюды.

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

Вот с чем пока в PHP в плане модульности не так шоколадно — это с assets.

Ненужно. В век, когда фронтенд собирается разнообразными инструментами, написанными преимущественно на js, мне кажется глупым пытаться продолжать тащить всё это говно на бэкенд.

Что я делаю, когда мне нужно запилить вебморду? Создаю package.json и возможно bower.json. Ставлю gulp или grunt, кучку плагинов к ним и вперёд. Не говоря уже о всяких генераторах, которые в одну команду могут подготовить каркас для проекта. Зачем использовать отстающие похапешные недоделки, когда всё необходимое уже написано и этим пользуется огромная армия фронтендерв по всему миру?

Надеюсь, что рано или поздно бэкэнду вообще не надо будет возиться с этими html,css,js и его основной задачей будет отдача json по запросу.

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

Ставлю gulp или grunt, кучку плагинов к ним

Всё это очень неудобно тащить на каждый продакшн :) Плюс получается зоопарк инструментов. А удобно, когда делаешь один composer install — и всё.

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

Имхо composer install — не лучший вариант деплоя. Тем более иногда нужны и компилируемые вещи, а компилятор на продакшне смотрится странно.

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

У меня весь зоопарк инструментов как раз разруливается с помощью Makefile. В общем-то других вариантов я не представляю.

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