Как инициировать функцию однажды, и только однажды …?

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

with open('filename') as infile:
    r = csv.reader(infile, delimiter=' ', skipinitialspace=True)
    for row in r:
        print(row)

Ваш файл выглядит так, как будто на вашем компьютере он разделен табуляцией. В этом случае вы измените delimiter=' ' на delimiter='\t' в приведенном выше.

Вы также можете использовать , который имеет более общий режим пробелов

df = pd.read_csv("filename", header=None, delim_whitespace=True)

6
задан defmeta 11 December 2008 в 04:00
поделиться

7 ответов

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

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

7
ответ дан 8 December 2019 в 13:03
поделиться

Это действительно зависит от точно, что Вы имеете в виду. Если Ваш код будет вызван больше чем от одного потока, то у Вас есть состояние состязания, которое могло означать это doMyFunction мог много раз называться. Это вызвано тем, что больше чем один поток мог проверить myStatus, посмотрите, что это - ложь, затем вызовите doMyFunction. Можно улучшить ситуацию немного путем установки переменной сначала:

if (!myStatus) {
    myStatus = true;
    doMyFunction();
}

но это только сужает окно для проблем, не устраняет его.

Для устранения состояния состязания Вам нужна блокировка.

5
ответ дан 8 December 2019 в 13:03
поделиться

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

0
ответ дан 8 December 2019 в 13:03
поделиться

В C/C++ можно обычно сохранять то, что doMyFunction () называют только когда-то инкапсулировавшим при помощи статической переменной как так:

void doMyFunction() {
     // gets called only once.
     // side effects go here.
}

void functionThatGetsCalledALot() {
    static bool called = false;
    if (!called) {
        doMyFunction();
        called = true;
    }
    // do more stuff
}

Это избегает использования globals, но имеет тот же эффект, и статический var объявляется правом, где это релевантно, таким образом, ясно, что продолжается. Обратите внимание, что это не ориентировано на многопотоковое исполнение, таким образом, Вам будет нужна блокировка, если у Вас будут потоки.

4
ответ дан 8 December 2019 в 13:03
поделиться

Это не ориентировано на многопотоковое исполнение. Это не могло бы иметь значения для Вас, но Вы действительно говорили "агностика языка": Вы, вероятно, не хотели бы использовать этот шаблон в библиотеке общего назначения для Java.

Это - трудный вопрос ответить агностическим языком способом, потому что доступные альтернативы очень зависят от языка. Например, на POSIX у Вас есть pthread_once при необходимости в потокобезопасности. В C у Вас есть статические локальные переменные для вытаскивания той булевской переменной из глобальной области видимости. На любом языке OO при взятии снимка "чего-то" для более позднего использования, затем мог бы быть подходящий объект, соответствующий "чему-то" (или к снимку), который мог сохранить флаг.

2
ответ дан 8 December 2019 в 13:03
поделиться

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

0
ответ дан 8 December 2019 в 13:03
поделиться

В Perl 5.10 или позже, Вы использовали бы a state переменная.

use 5.010;

sub test{
  state $once = 1;

  if( $once ){
    $once = undef;
    say 'first';
  } else {
    say 'not first';
  }
}

test for 1..5;

выводы

first
not first
not first
not first
not first
0
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

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