Re: Препроцессор в python
От: Daevaorn Россия  
Дата: 05.10.09 18:30
Оценка: +2
Здравствуйте, 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
Re[3]: Препроцессор в python
От: z00n  
Дата: 05.10.09 14:58
Оценка: 1 (1)
Здравствуйте, meandr, Вы писали:

M>Re: Препроцессор в python

M>Debug Release конфигурации, плюс разделение по платформам. Т.е запускаем на linux и кода от windows в модуле и не осталось. Мне ближе подобные вещи решать через препроцессор?

Avoid conditional compilation.

Сами создатели языка С выкинули эту возможность из препроцессора, когда разрабатывали Plan9.
How to Use the Plan 9 C Compiler

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.

Препроцессор в python
От: meandr  
Дата: 03.10.09 12:23
Оценка: -1
Hello, All!

Существует ли способ пропустит питон программу через препроцессор и результат уже запустить, и так чтобы это было встроено в python.

т.е. хочу как в perl, тока для python

python -P prog.py
Posted via RSDN NNTP Server 2.1 beta
Re: Препроцессор в python
От: FR  
Дата: 04.10.09 06:41
Оценка: +1
Здравствуйте, meandr, Вы писали:

M>Hello, All!


M>Существует ли способ пропустит питон программу через препроцессор и результат уже запустить, и так чтобы это было встроено в python.


M>т.е. хочу как в perl, тока для python


M>python -P prog.py


А зачем нужно?
Вообще в питоне обычный if на уровне модуля вполне заменяет препроцессор. Ну и для тяжелых случаев плюс метаклассы и декораторы.
Re[8]: Препроцессор в python
От: meandr  
Дата: 05.10.09 18:19
Оценка: +1
Re[7]: Препроцессор в python
Кстати это тоже не оптимизируеться

WINDOWS=false

if WINDOWS:
    print "windows"
else:
    print "something else"
Posted via RSDN NNTP Server 2.1 beta
Re: Препроцессор в python
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 04.10.09 10:11
Оценка:
Здравствуйте, meandr, Вы писали:

M>Hello, All!


M>Существует ли способ пропустит питон программу через препроцессор и результат уже запустить, и так чтобы это было встроено в python.


M>т.е. хочу как в perl, тока для python


M>python -P prog.py


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

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: Препроцессор в python
От: meandr  
Дата: 05.10.09 13:20
Оценка:
Re: Препроцессор в python
Debug Release конфигурации, плюс разделение по платформам. Т.е запускаем на linux и кода от windows в модуле и не осталось. Мне ближе подобные вещи решать через препроцессор?
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Препроцессор в python
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 05.10.09 14:05
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re: Препроцессор в python

M>Debug Release конфигурации, плюс разделение по платформам. Т.е запускаем на linux и кода от windows в модуле и не осталось. Мне ближе подобные вещи решать через препроцессор?

Если уж очень хочется в стиле препроцессора C, то есть вот такой проект: http://code.google.com/p/preprocess/ Еще можно AFAIK, запускать питоновские скрипты, пропуская их перед этим через сишный препроцессор (cpp) — говорят работает

Но питон на то и динамический язык, чтобы в т.ч. и подобные задачи решать в рантайме. Т.е.

DEBUG = True

#...где в недрах года...
if DEBUG:
  # делаем debug-specific вещи
else:
  # делаем release-specific вещи


кстати, именно для отладки можно использовать встроенную __debug__ (http://docs.python.org/reference/simple_stmts.html#the-assert-statement)

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[4]: Препроцессор в python
От: meandr  
Дата: 05.10.09 14:10
Оценка:
Re[3]: Препроцессор в python
Я про все эти штуки знаю! Но если уж есть компиляция не важно во что, она тем неменне она есть, то выкидывать части кода не нужные при работе по моему неплохой тон, а не поределять это каждый раз когда запускаем функцию
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Препроцессор в python
От: Cyberax Марс  
Дата: 05.10.09 14:14
Оценка:
Здравствуйте, meandr, Вы писали:

M>Я про все эти штуки знаю! Но если уж есть компиляция не важно во что, она тем неменне она есть, то выкидывать части кода не нужные при работе по моему неплохой тон, а не поределять это каждый раз когда запускаем функцию

Откуда в Питоне компиляция-то взялась? Есть только опциональное создание файлов с байт-кодом, которое компиляцией назвать можно только с натяжкой.
Sapienti sat!
Re[5]: Препроцессор в python
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 05.10.09 14:27
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re[3]: Препроцессор в python

M>Я про все эти штуки знаю! Но если уж есть компиляция не важно во что, она тем неменне она есть,

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

M>то выкидывать части кода не нужные при работе по моему неплохой тон, а не поределять это каждый раз когда запускаем функцию


А что смущает-то?

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[6]: Препроцессор в python
От: meandr  
Дата: 05.10.09 14:31
Оценка:
Re[5]: Препроцессор в python
Компиляция в байт код там есть. И python это всё ткаи виртуальная машина больше чем интерпритатор.
А смущает исключительно моё имхо
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Препроцессор в python
От: meandr  
Дата: 05.10.09 14:33
Оценка:
Re[5]: Препроцессор в python
Это почему это?
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Препроцессор в python
От: Cyberax Марс  
Дата: 05.10.09 15:01
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re[5]: Препроцессор в python

M>Это почему это?
Что именно? Что в Питоне нет компиляции или что?
Sapienti sat!
Re[7]: Препроцессор в python
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 05.10.09 15:19
Оценка:
Здравствуйте, 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>А смущает исключительно моё имхо


Но аргументы какие-то же есть? Производительность? Эстетика байт-кода?

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[8]: Препроцессор в python
От: meandr  
Дата: 05.10.09 18:06
Оценка:
Re[7]: Препроцессор в python
>>WINDOWS=false

>>if WINDOWS:

>> print "windows"
>>else:
>> print "something else"


>>будет сформирован как:


>>WINDOWS=false


>>print "something else"



>>что собственно и рекомендуют делать при использовании ассертов посредством __debug__ (см. ссылку, >>которую я давал выше). Чем это не устраивает?


>>M>А смущает исключительно моё имхо


>>Но аргументы какие-то же есть? Производительность? Эстетика байт-кода?


Вот что вы указали и являеться аргументом, мне что то слабо вериться что оно так делаеться хотя вполне возможно я и не прав

и неужели такая конструкция бедет преобразована на windows платформе

if os.name == 'nt':
   blah blah blah windows
elif os.name == 'posix':
   blah blah blah posix

в

blah blah blah windows


??????? Вот сейчас проверил это не так. Минимальный пример

имеем модуль Pytest.py:

import os;

if os.name == 'nt':
  print "hellow widnows";
elif os.name == 'posix':
  print "hellow posix";




и питоновский скрип который его использует

test.py


Запускаем все на windows получаем cкомпиленый в байт код Pytest.pyc копируем его и test.py на unix машину (FreeBSD7.1) зупускаем и получаем "hellow posix", значит это место не заоптимизировано


Более того в примере что вы указали есть очень большой промах а имеено использование в модулях __debug__ будет false и этот код действительно будет заотимизирован с выкидыванием debug версии. Что в debug окружении очень неудобно
Posted via RSDN NNTP Server 2.1 beta
Re[8]: Препроцессор в python
От: meandr  
Дата: 05.10.09 18:08
Оценка:
Re[7]: Препроцессор в python
>>Что именно? Что в Питоне нет компиляции или что?

Да я не согласен что там нет компиляции. Более того там чать кода даж оптимизируеться. Безусловно это не трансляция в машинно зависимый формат, но все таки компиляция, и испольнение кода в виртуальной машине
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Препроцессор в python
От: meandr  
Дата: 05.10.09 18:11
Оценка:
Re[3]: Препроцессор в python
Eue спасибо идею я понял, чет даж незадумывался об этом что сам компайлер викидывает неиспользуемый код, но как сделать так чтобы питон выкинул часть платформенно зависимого кода по условию ума не приложу.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Препроцессор в python
От: Cyberax Марс  
Дата: 05.10.09 18:13
Оценка:
Здравствуйте, meandr, Вы писали:

M>Eue спасибо идею я понял, чет даж незадумывался об этом что сам компайлер викидывает неиспользуемый код, но как сделать так чтобы питон выкинул часть платформенно зависимого кода по условию ума не приложу.

А зачем?
Sapienti sat!
Re[6]: Препроцессор в python
От: meandr  
Дата: 05.10.09 18:20
Оценка:
Re[5]: Препроцессор в python
Если следовать вашей логике то зачем оптимизация нужна вообще, и так все работает
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Препроцессор в python
От: Cyberax Марс  
Дата: 05.10.09 18:48
Оценка:
Здравствуйте, meandr, Вы писали:

M>Если следовать вашей логике то зачем оптимизация нужна вообще, и так все работает

Оптимизация нужна там, где она нужна.

Здесь она не нужна.
Sapienti sat!
Re[9]: Препроцессор в python
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 05.10.09 19:24
Оценка:
Здравствуйте, meandr, Вы писали:

M>Запускаем все на windows получаем cкомпиленый в байт код Pytest.pyc копируем его и test.py на unix машину (FreeBSD7.1) зупускаем и получаем "hellow posix", значит это место не заоптимизировано


Да, действительно отпимизирует только если в условии используется именно __debug__ а не собственные значения тут я ошибся.

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[5]: Препроцессор в python
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 05.10.09 19:24
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re[3]: Препроцессор в python

M>Eue спасибо идею я понял, чет даж незадумывался об этом что сам компайлер викидывает неиспользуемый код, но как сделать так чтобы питон выкинул часть платформенно зависимого кода по условию ума не приложу.

Видимо остается только вариант вынести платформенно-зависимый код в функции или классы в отдельных модулях и использовать динамический import

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[6]: Препроцессор в python
От: FR  
Дата: 06.10.09 04:29
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Видимо остается только вариант вынести платформенно-зависимый код в функции или классы в отдельных модулях и использовать динамический import


Есть еще варианты для особо упорных. В питоне в стандартных модулях практически полностью доступен компилятор в байт код, есть возможность анализировать и менять AST и в общем вполне возможно написать свой компилятор в байт код, выкидывающий все ненужное. Задача не сложная но достаточно муторная.
Ну и для настоящих джедаев, можно написать утилиту преобразующую уже готовый байт код.
Re[2]: Препроцессор в python
От: meandr  
Дата: 09.10.09 07:55
Оценка:
Re: Препроцессор в python
>>Вообще идея заиметь препроцессор в питоне конечно бредовая. Но если мозг съеден целью "оптимизацией до посинения", то подобные вопросы решаются >>>архитектурно — весь платформо-зависимый код кладется в разные модули и где надо делается их условный импорт.


>>>if os.name == 'posix':

>>> import post_rel as rel
>>>else:
>>> import nt_rel as rel

Угу я вообщем то согласен. Тока не могу понять одного почему платформу на которой выполняеться python нелюзя было сделать тоже встроенной перменной, как __debug__? В этом случае часть кода бы просто была викинута при компиляции и никогда бы не исполнялось ветвление.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Препроцессор в python
От: Daevaorn Россия  
Дата: 09.10.09 08:27
Оценка:
Здравствуйте, meandr, Вы писали:

M>Угу я вообщем то согласен. Тока не могу понять одного почему платформу на которой выполняеться python нелюзя было сделать тоже встроенной перменной, как __debug__? В этом случае часть кода бы просто была викинута при компиляции и никогда бы не исполнялось ветвление.


Потому что питон по большей части кросс-платформенный, а потому платформо-зависимые модули или часть кода в них не очень распространенный юз-кейс. Потом при правильной архитектуре, как уже было сказано выше, ифы не проблема.
Re[4]: Препроцессор в python
От: meandr  
Дата: 09.10.09 09:11
Оценка:
Re[3]: Препроцессор в python
>>Потому что питон по большей части кросс-платформенный, а потому платформо-зависимые модули или часть кода в них не очень распространенный юз-кейс.

Если это все так то почему же в стандартной библиотеке Python море платформо специфичного кода.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: Препроцессор в python
От: Daevaorn Россия  
Дата: 09.10.09 10:02
Оценка:
Здравствуйте, meandr, Вы писали:

M>Re[3]: Препроцессор в python

>>>Потому что питон по большей части кросс-платформенный, а потому платформо-зависимые модули или часть кода в них не очень распространенный юз-кейс.

M>Если это все так то почему же в стандартной библиотеке Python море платформо специфичного кода.


Это плата за то чтобы клиентский код был более высокоуровневым и не зависел от платформы. Это справдливо для всех языков и их стандартных библиотек. Плюс ко всеми в питоне многое из стандартной библиотеки написано не на нем самом а на Си.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.