Условная компиляция в Python

Предположим, у вас есть серия timedelta:

import pandas as pd
from datetime import datetime
z = pd.DataFrame({'a':[datetime.strptime('20150101', '%Y%m%d')],'b':[datetime.strptime('20140601', '%Y%m%d')]})

td_series = (z['a'] - z['b'])

. Один из способов конвертировать этот timedelta-столбец или серию - это передать его объекту Timedelta (pandas 0.15.0+), а затем извлечь дни из объект:

td_series.astype(pd.Timedelta).apply(lambda l: l.days)

Другой способ состоит в том, чтобы вывести серию как timedelta64 в днях, а затем передать ее как int:

td_series.astype('timedelta64[D]').astype(int)
16
задан David Segonds 18 February 2009 в 08:32
поделиться

4 ответа

Python не компилируется в том же смысле как C или C++ или даже Java, файлы Python компилируются "на лету", можно думать о нем как являющийся подобным интерпретируемому языку как Основной или Perl. 1

можно сделать что-то эквивалентное условной компиляции, просто используя если оператор. Например:

if FLAG:
    def f():
        print "Flag is set"
else:
    def f():
        print "Flag is not set"

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

самый близкий способ подражать IFDEF состоял бы в том, чтобы использовать функцию hasattr. Например:

if hasattr(aModule, 'FLAG'):
    # do stuff if FLAG is defined in the current module.

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

  1. код Python является байтом, скомпилированным в промежуточную форму как Java, однако обычно нет шага раздельной компиляции. "Необработанные" исходные файлы, которые заканчиваются в .py, являются исполняемым файлом.
23
ответ дан 30 November 2019 в 10:16
поделиться

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

if __debug__:
    doSomething()

Эти __debug__ флаг является особым случаем. При вызове Python с -O или -OO опции, __debug__ будут ложью, и компилятор проигнорирует тот оператор. Это используется, прежде всего, с, утверждает, который является, почему утверждения уходят 'при реальной компиляции' сценариев с оптимизацией.

Поэтому, если Ваша цель состоит в том, чтобы добавить отладку кода, но препятствовать тому, чтобы он замедлился или иначе влиял на сборку 'выпуска', это делает то, что Вы хотите. Но Вы не можете присвоить значение __debug__, таким образом, это обо всем, для чего можно использовать его.

19
ответ дан 30 November 2019 в 10:16
поделиться

Python компилирует модуль автоматически при импорте его таким образом, единственный способ постараться не компилировать его не состоит в том, чтобы импортировать его. Можно записать что-то как:

if some_condition:
  import some_module

, Но это только работало бы на полные модули. В C и C++ Вы обычно используете препроцессор для условной компиляции. Нет ничего мешающего Вам использовать препроцессор на Вашем коде Python, таким образом, Вы могли записать что-то как:

#ifdef SOME_CONDITION
def some_function():
  pass
#endif

Выполнение, что через препроцессор C и у Вас была бы реальная условная компиляция и some_function, будет только определено, если SOME_CONDITION будет определен.

, НО (и это важно): Условная компиляция, вероятно, не, что Вы хотите. Помните, что при импорте модуля Python просто выполняет код в нем. Определение и операторы класса в модуле на самом деле , выполнился , когда Вы импортируете модуль. Таким образом, типичным способом реализовать, для чего другие языки использовали бы условную компиляцию, является просто нормальное если оператор, как:

if some_condition:
  def some_function():
    pass

Это только определит some_function, если some_condition будет верно.

Это - материал как это, которое делает динамические языки настолько мощными, оставаясь концептуально простым.

4
ответ дан 30 November 2019 в 10:16
поделиться

Не имеет большого смысла в динамической среде. При поиске условного определения функций можно использовать if:

if happy:
    def makemehappy():
        return "I'm good"
3
ответ дан 30 November 2019 в 10:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: