Создать скрипт для распечатки текста перед символом:, каждый вывод в отдельной строке

Это фактически не имеет ничего общего с значениями по умолчанию, кроме того, что часто возникает неожиданное поведение при записи функций с изменяемыми значениями по умолчанию.

>>> def foo(a):
    a.append(5)
    print a

>>> a  = [5]
>>> foo(a)
[5, 5]
>>> foo(a)
[5, 5, 5]
>>> foo(a)
[5, 5, 5, 5]
>>> foo(a)
[5, 5, 5, 5, 5]

В этом нет значений по умолчанию код, но вы получаете точно такую ​​же проблему.

Проблема в том, что foo является изменением изменчивой переменной, переданной от вызывающего, когда вызывающий объект не ожидает этого , Код, подобный этому, был бы хорош, если бы функция была вызвана как-то вроде append_5; то вызывающий абонент будет вызывать функцию, чтобы изменить значение, которое они передают, и поведение будет ожидаться. Но такая функция вряд ли примет аргумент по умолчанию и, вероятно, не вернет список (поскольку у вызывающего уже есть ссылка на этот список, тот, который он только что передал).

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

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

0
задан Ana 26 March 2019 в 14:00
поделиться

2 ответа

Если вы хотите, чтобы вывод представлял собой последовательный файл, в котором для каждой строки указано одно имя хоста или IP-адрес, то этого sed достаточно:

sed 'y/:/\n/' infile
0
ответ дан ctac_ 26 March 2019 в 14:00
поделиться

Сначала удалите несколько пробелов для более простой команды grep

sed 's/[ ]*:[ ]*/:/g' file | grep -Eo "[a-zA-Z][^:]*:[0-9.]*"

или

sed 's/[ ]*:[ ]*/:/g' file | grep -Eo "[^:]+:[0-9.]*"

РЕДАКТИРОВАТЬ: Сначала я использовал h для нахождения первой буквы имени хоста .

0
ответ дан Walter A 26 March 2019 в 14:00
поделиться
Другие вопросы по тегам:

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