2015-08-06 3 views
1

Я хочу поддерживать одну базу кода, где я могу динамически включать и отключать некоторые функции для другой версии сборки. Конечно, я могу сделать это с помощью флагов компилятора в C/C++, имея несколько конфигураций сборки. Но как я могу это сделать с Python? Есть ли эквивалентная технология в Python?Какова эквивалентная функция флагов компилятора C++ в Python?

+0

Python не поддерживает условную компиляцию. –

+0

Есть ли какой-либо способ добиться того же в python? любые взломы с использованием аргументов командной строки или что-то еще? – Kaje

+0

Какие функции компилятора C++ вы специально хотите в Python? – Galik

ответ

1

В C, конечно, препроцессор используется для определения того, какие части программы включены или исключены. Существует жесткое и быстрое разграничение между препроцессором и основным программным кодом.

Нет препроцессора, и поэтому такого пиринга в Python не может показаться странным для программиста на C. Но только потому, что такого разграничения нет, это не означает, что вы не можете перенастроить свое приложение.

Python чрезвычайно динамичен - одна из приятных особенностей Python заключается в том, что приложение может даже быть переконфигурировано «на лету», читая файлы конфигурации, которые либо находятся в специализированном формате (некоторые из них поддерживаются в стандартной библиотеке) , или даже в Python.

Существуют расширенные способы перенастройки приложения, но наиболее простым, возможно, является файл конфигурации, который является чистым Python. Например, вы могли бы иметь myconfig.py, который имеет такие заявления: сценарий конфигурации

use_widgets = True 
use_cogs = False 

Это Python может даже существовать, когда пользователь выполняет программу с; такое поведение легко поддерживается путем добавления текущего каталога в пути поиска модулей:

import sys 
sys.path.insert(0, '.') 
import myconfig 

Как вы знаете, в C, #if является более эффективным, чем if, потому что результаты предварительно вычислены перед выполнением. Python не имеет #if, но в отличие от C, if операторы могут легко существовать вне какой-либо функции, так что вы можете заменить целые участки кода в зависимости от конфигурации:

if myconfig.use_widgets: 

    def myfunc(.....): 
     <definition that uses widgets> 

else: 

    def myfunc(.....): 
     <non-widget definition> 

Когда модуль импортируется, Python будет компилировать (если он еще не был предварительно скомпилирован в файл .pyc), а затем выполните тело модуля. Это выполнение свяжет первое определение модуля (для виджетов с использованием myfunc) с идентификатором myfunc в глобальных переменных модуля и немедленно отменит не-виджет myfunc (не выполняя предложение else).

Это немного менее эффективно при запуске, чем наличие одного myfunc, но после запуска нет штрафа во время исполнения - второй myfunc исчезает и больше никогда не отображается, а первый myfunc оптимизирован для случая, когда у вас есть виджеты, это тот, который выполняется, когда другая часть программы вызывает myfunc.

Смежные вопросы