Активируйте virtualenv через матрицу, как развертывают пользователя

Новые Блочные операции

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

  1. Вы объявляете прототип для sub указание, что он берет ссылку кода сначала:

    sub do_stuff_with_a_hash (&\%) {
        my ( $block_of_code, $hash_ref ) = @_;
        while ( my ( $k, $v ) = each %$hash_ref ) { 
            $block_of_code->( $k, $v );
        }
    }
    
  2. можно тогда звонить, это в теле как так

    use Data::Dumper;
    
    do_stuff_with_a_hash {
        local $Data::Dumper::Terse = 1;
        my ( $k, $v ) = @_;
        say qq(Hey, the key   is "$k"!);
        say sprintf qq(Hey, the value is "%v"!), Dumper( $v );
    
    } %stuff_for
    ;
    

(Data::Dumper::Dumper другое полускрытое сокровище.) Уведомление, как Вам не нужно sub ключевое слово перед блоком или запятая перед хешем. Это заканчивает тем, что смотрело много как: map { } @list

Фильтры источника

кроме того, существуют фильтры источника. Куда Perl передаст Вас код, таким образом, можно будет управлять им. И это и блочные операции, являются в значительной степени don't-try-this-at-home типом вещей.

я сделал некоторые аккуратные вещи с фильтрами источника, например, как создание очень простого языка для проверки времени, позволив короткие остроты Perl для некоторого принятия решений:

perl -MLib::DB -MLib::TL -e 'run_expensive_database_delete() if $hour_of_day < AM_7';

Lib::TL просто просканировал бы и для "переменных" и для констант, создал бы их и заменил бы ими по мере необходимости.

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

Рычаги Сигнала

Это часто достаточно делается, но это не все это очевидное. Вот умереть обработчик что свиные спины на старой.

my $old_die_handler = $SIG{__DIE__};
$SIG{__DIE__}       
    = sub { say q(Hey! I'm DYIN' over here!); goto &$old_die_handler; }
    ;

, Который означает каждый раз, когда некоторый другой модуль в коде хочет умереть, они должны прибыть к Вам (если кто-то еще не делает разрушительную перезапись на $SIG{__DIE__}). И Вы можете быть уведомлены, что кто-то вещи что-то - ошибка.

, Конечно, для достаточного количества вещей можно просто использовать END { } блок, если все, что Вы хотите сделать, является уборкой.

overload::constant

можно осмотреть литералы определенного типа в пакетах, которые включают модуль. Например, если Вы используете это в Вашем import sub:

overload::constant 
    integer => sub { 
        my $lit = shift;
        return $lit > 2_000_000_000 ? Math::BigInt->new( $lit ) : $lit 
    };

это будет означать, что каждое целое число, больше, чем 2 миллиарда в пакетах вызова, будет изменено на Math::BigInt объект. (См. перегрузка:: постоянный ).

Сгруппированные Целочисленные Литералы

, В то время как мы в нем. Perl позволяет Вам разбивать большие количества в группы из трех цифр и все еще вытаскивать parsable целое число из него. Примечание 2_000_000_000 выше для 2 миллиардов.

128
задан Flimm 25 April 2013 в 14:13
поделиться

2 ответа

Прямо сейчас вы можете делать то, что делаю я, что беспорядочно, но отлично работает * (это использование предполагает, что вы используете virtualenvwrapper - - что вы должны быть - но вы можете легко заменить его в более длинном вызове 'source', который вы упомянули, если нет):

def task():
    workon = 'workon myvenv && '
    run(workon + 'git pull')
    run(workon + 'do other stuff, etc')

Начиная с версии 1.0, Fabric имеет префикс диспетчер контекста , который использует эту технику, чтобы вы могли, например:

def task():
    with prefix('workon myvenv'):
        run('git pull')
        run('do other stuff, etc')

* Вероятны случаи, когда использование подхода command1 && command2 может вас подорвать, например, когда command1 терпит неудачу ( command2 никогда не запустится) или если command1 не работает »t правильно экранирован и содержит специальные символы оболочки и т. д.

95
ответ дан 24 November 2019 в 00:38
поделиться

Я просто использую простую функцию-оболочку virtualenv (), которую можно вызывать вместо run (). Он не использует диспетчер контекста компакт-диска, поэтому можно использовать относительные пути.

def virtualenv(command):
    """
    Run a command in the virtualenv. This prefixes the command with the source
    command.
    Usage:
        virtualenv('pip install django')
    """
    source = 'source %(project_directory)s/bin/activate && ' % env
    run(source + command)
17
ответ дан 24 November 2019 в 00:38
поделиться
Другие вопросы по тегам:

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