Различать вызов уникального аргумента и предоставление строки вместе с ней с помощью argparse во взаимной эксклюзивной группе

/** Function that count occurrences of a substring in a string;
 * @param {String} string               The string
 * @param {String} subString            The sub string to search for
 * @param {Boolean} [allowOverlapping]  Optional. (Default:false)
 *
 * @author Vitim.us https://gist.github.com/victornpb/7736865
 * @see Unit Test https://jsfiddle.net/Victornpb/5axuh96u/
 * @see http://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string/7924240#7924240
 */
function occurrences(string, subString, allowOverlapping) {

    string += "";
    subString += "";
    if (subString.length <= 0) return (string.length + 1);

    var n = 0,
        pos = 0,
        step = allowOverlapping ? 1 : subString.length;

    while (true) {
        pos = string.indexOf(subString, pos);
        if (pos >= 0) {
            ++n;
            pos += step;
        } else break;
    }
    return n;
}

Использование

occurrences("foofoofoo", "bar"); //0

occurrences("foofoofoo", "foo"); //3

occurrences("foofoofoo", "foofoo"); //1

allowOverlapping

occurrences("foofoofoo", "foofoo", true); //2

Совпадения:

  foofoofoo
1 `----´
2    `----´

Единичный тест

Benchmark

Я проверил тестовый тест и моя функция более чем в 10 раз быстрее, чем функция соответствия регулярному выражению, отправленная gumbo. В моей тестовой строке длина 25 символов. с 2 вхождениями символа 'o'. Я выполнил 1 000 000 раз в Safari.

Safari 5.1

Benchmark> Общее время исполнения: 5617 ms (regexp)

Benchmark> Общее время исполнения: 881 ms (моя функция в 6.4 раза быстрее)

Firefox 4

Benchmark> Общее время исполнения: 8547 мс (Rexexp)

Benchmark> Общее время исполнения: 634 мс (моя функция на 13,5 раз быстрее)


Изменить: изменения, которые я сделал

  • длина кешированной кешировки
  • добавлена ​​листинг типа в строку .
  • добавлен дополнительный параметр «allowOverlapping»
  • исправленный правильный вывод для «пустого случая подстроки».
Gist
0
задан Sergio Fernández 13 July 2018 в 09:49
поделиться

1 ответ

Думаю, вам просто нужно добавить `nargs = '?' к аргументам. Это позволяет использовать трехсторонний вход - значение по умолчанию, константу и значение пользователя.

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

In [3]: parser = argparse.ArgumentParser()
   ...: group_input = parser.add_mutually_exclusive_group(required=True)
   ...: group_input.add_argument("-s","--serial-number", default=1,nargs='?',const=2,type=int); 
   ...: group_input.add_argument("-e","--event", default=1,nargs='?',const=3,type=int);
   ...: 
   ...: 
In [4]: parser.parse_args('-s'.split())
Out[4]: Namespace(event=1, serial_number=2)

In [5]: parser.parse_args('-s 1234'.split())
Out[5]: Namespace(event=1, serial_number=1234)

In [6]: parser.parse_args('-e'.split())
Out[6]: Namespace(event=3, serial_number=1)

In [7]: parser.parse_args('-e 1232'.split())
Out[7]: Namespace(event=1232, serial_number=1)

In [8]: parser.parse_args('-e 1232 -s'.split())
usage: ipython3 [-h] (-s [SERIAL_NUMBER] | -e [EVENT])
ipython3: error: argument -s/--serial-number: not allowed with argument -e/--event
....

Поскольку группа required, вы должны указать один из аргументов -s или -e

In [9]: parser.parse_args(''.split())
usage: ipython3 [-h] (-s [SERIAL_NUMBER] | -e [EVENT])
ipython3: error: one of the arguments -s/--serial-number -e/--event is required
....

A store_true.

0
ответ дан hpaulj 17 August 2018 в 13:14
поделиться
Другие вопросы по тегам:

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