Понимание списка с помощью xonsh - PullRequest
0 голосов
/ 18 мая 2018

Я все еще новичок в этом, но возможно ли выполнить несколько команд в xonsh с использованием синтаксиса списка-списка?

Я ожидал бы, что следующее создаст пять файлов file00 до file04, но вместо этого появляются ошибки:

$ [@(['touch', 'file%02d' % i]) for i in range(5)]
............................ 
xonsh: For full traceback set: $XONSH_SHOW_TRACEBACK = True
  File "<string>", line None
SyntaxError: <xonsh-code>:1:1: ('code: @(',)
[@(['touch', 'file%02d' % i]) for i in range(5)]
 ^

Я ожидал бы, что это сработает, потому что следующее прекрасно работает:

$ [i for i in range(5)]
[0, 1, 2, 3, 4]

$ @(['touch', 'file%02d' % 3])
$ ls
file03

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Похоже, вы нашли способ сделать это - иногда поведение конкретной команды подпроцесса может влиять на то, как вы все это сложите.

В случае touch, так как это может занятьмножественные аргументы, самый простой способ обернуть это в понимание списка (о котором я могу думать) - это сделать

touch @([f'file_{i}' for i in range(5)])

0 голосов
/ 19 мая 2018

Наиболее близким к исходному коду является использование подпроцесса:

[$[touch @('file%02d' % i)] for i in range(5)]

Для объяснения необходимости вложения $[ .. @(:

  • Команда верхнего уровня является списком, поэтому мы начинаем в режиме Python;
  • Мы хотим выполнить команду bash (touch), поэтому нам нужно войти в режим подпроцесса с помощью $[ (или $( для захвата выходных данных);
  • Но аргумент этой команды требует интерполяции строк с Python, следовательно, режим Python снова с @(.
0 голосов
/ 18 мая 2018

Я был почти там, необходимо обернуть команду дальше:

$ [ $(@(['touch', 'file%02d' % i])) for i in range(5)]

Причина этого заключается в следующем:

  • Учитывая, что команда верхнего уровняэто понимание списка, мы входим в Python-режим
  • Мы хотим выполнить команду bash (touch), поэтому нам нужно войти в подпроцесс-режим с $(
  • Однако,Аргумент этой команды требует интерполяции строк с Python, поэтому для написания самой команды требуется режим Python, поэтому @(
...