Здравствуйте, meandr, Вы писали:
M>Hello, All!
M>Существует ли способ пропустит питон программу через препроцессор и результат уже запустить, и так чтобы это было встроено в python.
M>т.е. хочу как в perl, тока для python
M>python -P prog.py
Вообще идея заиметь препроцессор в питоне конечно бредовая. Но если мозг съеден целью "оптимизацией до посинения", то подобные вопросы решаются архитектурно — весь платформо-зависимый код кладется в разные модули и где надо делается их условный импорт.
if os.name == 'posix':
import post_rel as rel
else:
import nt_rel as rel
Здравствуйте, meandr, Вы писали:
M>Re: Препроцессор в python M>Debug Release конфигурации, плюс разделение по платформам. Т.е запускаем на linux и кода от windows в модуле и не осталось. Мне ближе подобные вещи решать через препроцессор?
The #if directive was omitted because it greatly complicates the preprocessor, is never necessary, and is usually abused. Conditional compilation in general makes code hard to understand; the Plan 9 source uses it very sparingly. Also, because the compilers remove dead code, regular if statements with constant conditions are more readable equivalents to many #ifs. To compile imported code ineluctably fouled by #if there is a separate command, /bin/cpp, that implements the complete ANSI C preprocessor specification.
Здравствуйте, meandr, Вы писали:
M>Hello, All!
M>Существует ли способ пропустит питон программу через препроцессор и результат уже запустить, и так чтобы это было встроено в python.
M>т.е. хочу как в perl, тока для python
M>python -P prog.py
А зачем нужно?
Вообще в питоне обычный if на уровне модуля вполне заменяет препроцессор. Ну и для тяжелых случаев плюс метаклассы и декораторы.
Здравствуйте, meandr, Вы писали:
M>Hello, All!
M>Существует ли способ пропустит питон программу через препроцессор и результат уже запустить, и так чтобы это было встроено в python.
M>т.е. хочу как в perl, тока для python
M>python -P prog.py
Вообще-то, как уже сказал выше FR, метапрограммирование в питоне развито в достаточной степени, чтобы вопросы о наличии в нем препроцессора вообще не возникали. Какую конкретную задачу предполагается возложить на препроцессор?
Re: Препроцессор в python
Debug Release конфигурации, плюс разделение по платформам. Т.е запускаем на linux и кода от windows в модуле и не осталось. Мне ближе подобные вещи решать через препроцессор?
Здравствуйте, meandr, Вы писали:
M>Re: Препроцессор в python M>Debug Release конфигурации, плюс разделение по платформам. Т.е запускаем на linux и кода от windows в модуле и не осталось. Мне ближе подобные вещи решать через препроцессор?
Если уж очень хочется в стиле препроцессора C, то есть вот такой проект: http://code.google.com/p/preprocess/ Еще можно AFAIK, запускать питоновские скрипты, пропуская их перед этим через сишный препроцессор (cpp) — говорят работает
Но питон на то и динамический язык, чтобы в т.ч. и подобные задачи решать в рантайме. Т.е.
Re[3]: Препроцессор в python
Я про все эти штуки знаю! Но если уж есть компиляция не важно во что, она тем неменне она есть, то выкидывать части кода не нужные при работе по моему неплохой тон, а не поределять это каждый раз когда запускаем функцию
Здравствуйте, meandr, Вы писали:
M>Я про все эти штуки знаю! Но если уж есть компиляция не важно во что, она тем неменне она есть, то выкидывать части кода не нужные при работе по моему неплохой тон, а не поределять это каждый раз когда запускаем функцию
Откуда в Питоне компиляция-то взялась? Есть только опциональное создание файлов с байт-кодом, которое компиляцией назвать можно только с натяжкой.
Здравствуйте, meandr, Вы писали:
M>Re[3]: Препроцессор в python M>Я про все эти штуки знаю! Но если уж есть компиляция не важно во что, она тем неменне она есть,
Нету там компиляции. Есть то, о чем написал выше Cyberax и не менее опциональное создание автономных исполняемых файлов сторонними средствами. Если ты про второе, то ничего не мешает разметить проект а-ля C и перед компоновкой проекта в исполняемый файл прогонять его через сишный или указанный мной питоновский препроцессор каким-нибудь скриптом. Только это уже извращение, на мой взгляд.
M>то выкидывать части кода не нужные при работе по моему неплохой тон, а не поределять это каждый раз когда запускаем функцию
Re[5]: Препроцессор в python
Компиляция в байт код там есть. И python это всё ткаи виртуальная машина больше чем интерпритатор.
А смущает исключительно моё имхо
Здравствуйте, meandr, Вы писали:
M>Re[5]: Препроцессор в python M>Компиляция в байт код там есть. И python это всё ткаи виртуальная машина больше чем интерпритатор.
Насколько я понимаю, если питон запустить с ключом оптимизации (-O), то байт-код для подобных конструкций:
WINDOWS=false
if WINDOWS:
print"windows"else:
print"something else"
будет сформирован как:
WINDOWS=false
print"something else"
что собственно и рекомендуют делать при использовании ассертов посредством __debug__ (см. ссылку, которую я давал выше). Чем это не устраивает?
M>А смущает исключительно моё имхо
Но аргументы какие-то же есть? Производительность? Эстетика байт-кода?
>>что собственно и рекомендуют делать при использовании ассертов посредством __debug__ (см. ссылку, >>которую я давал выше). Чем это не устраивает?
>>M>А смущает исключительно моё имхо
>>Но аргументы какие-то же есть? Производительность? Эстетика байт-кода?
Вот что вы указали и являеться аргументом, мне что то слабо вериться что оно так делаеться хотя вполне возможно я и не прав
и неужели такая конструкция бедет преобразована на windows платформе
if os.name == 'nt':
blah blah blah windows
elif os.name == 'posix':
blah blah blah posix
в
blah blah blah windows
??????? Вот сейчас проверил это не так. Минимальный пример
Запускаем все на windows получаем cкомпиленый в байт код Pytest.pyc копируем его и test.py на unix машину (FreeBSD7.1) зупускаем и получаем "hellow posix", значит это место не заоптимизировано
Более того в примере что вы указали есть очень большой промах а имеено использование в модулях __debug__ будет false и этот код действительно будет заотимизирован с выкидыванием debug версии. Что в debug окружении очень неудобно
Re[7]: Препроцессор в python >>Что именно? Что в Питоне нет компиляции или что?
Да я не согласен что там нет компиляции. Более того там чать кода даж оптимизируеться. Безусловно это не трансляция в машинно зависимый формат, но все таки компиляция, и испольнение кода в виртуальной машине
Re[3]: Препроцессор в python
Eue спасибо идею я понял, чет даж незадумывался об этом что сам компайлер викидывает неиспользуемый код, но как сделать так чтобы питон выкинул часть платформенно зависимого кода по условию ума не приложу.
Здравствуйте, meandr, Вы писали:
M>Eue спасибо идею я понял, чет даж незадумывался об этом что сам компайлер викидывает неиспользуемый код, но как сделать так чтобы питон выкинул часть платформенно зависимого кода по условию ума не приложу.
А зачем?
Здравствуйте, meandr, Вы писали:
M>Если следовать вашей логике то зачем оптимизация нужна вообще, и так все работает
Оптимизация нужна там, где она нужна.
Здравствуйте, meandr, Вы писали:
M>Запускаем все на windows получаем cкомпиленый в байт код Pytest.pyc копируем его и test.py на unix машину (FreeBSD7.1) зупускаем и получаем "hellow posix", значит это место не заоптимизировано
Да, действительно отпимизирует только если в условии используется именно __debug__ а не собственные значения тут я ошибся.
Здравствуйте, meandr, Вы писали:
M>Re[3]: Препроцессор в python M>Eue спасибо идею я понял, чет даж незадумывался об этом что сам компайлер викидывает неиспользуемый код, но как сделать так чтобы питон выкинул часть платформенно зависимого кода по условию ума не приложу.
Видимо остается только вариант вынести платформенно-зависимый код в функции или классы в отдельных модулях и использовать динамический import
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Видимо остается только вариант вынести платформенно-зависимый код в функции или классы в отдельных модулях и использовать динамический import
Есть еще варианты для особо упорных. В питоне в стандартных модулях практически полностью доступен компилятор в байт код, есть возможность анализировать и менять AST и в общем вполне возможно написать свой компилятор в байт код, выкидывающий все ненужное. Задача не сложная но достаточно муторная.
Ну и для настоящих джедаев, можно написать утилиту преобразующую уже готовый байт код.
Re: Препроцессор в python >>Вообще идея заиметь препроцессор в питоне конечно бредовая. Но если мозг съеден целью "оптимизацией до посинения", то подобные вопросы решаются >>>архитектурно — весь платформо-зависимый код кладется в разные модули и где надо делается их условный импорт.
>>>if os.name == 'posix': >>> import post_rel as rel >>>else: >>> import nt_rel as rel
Угу я вообщем то согласен. Тока не могу понять одного почему платформу на которой выполняеться python нелюзя было сделать тоже встроенной перменной, как __debug__? В этом случае часть кода бы просто была викинута при компиляции и никогда бы не исполнялось ветвление.
Здравствуйте, meandr, Вы писали:
M>Угу я вообщем то согласен. Тока не могу понять одного почему платформу на которой выполняеться python нелюзя было сделать тоже встроенной перменной, как __debug__? В этом случае часть кода бы просто была викинута при компиляции и никогда бы не исполнялось ветвление.
Потому что питон по большей части кросс-платформенный, а потому платформо-зависимые модули или часть кода в них не очень распространенный юз-кейс. Потом при правильной архитектуре, как уже было сказано выше, ифы не проблема.
Re[3]: Препроцессор в python >>Потому что питон по большей части кросс-платформенный, а потому платформо-зависимые модули или часть кода в них не очень распространенный юз-кейс.
Если это все так то почему же в стандартной библиотеке Python море платформо специфичного кода.
Здравствуйте, meandr, Вы писали:
M>Re[3]: Препроцессор в python >>>Потому что питон по большей части кросс-платформенный, а потому платформо-зависимые модули или часть кода в них не очень распространенный юз-кейс.
M>Если это все так то почему же в стандартной библиотеке Python море платформо специфичного кода.
Это плата за то чтобы клиентский код был более высокоуровневым и не зависел от платформы. Это справдливо для всех языков и их стандартных библиотек. Плюс ко всеми в питоне многое из стандартной библиотеки написано не на нем самом а на Си.