Python: эффективный способ подстановки элемента списка в строку

1

Я создаю оболочку для сервера Minecraft, которая должна принимать новые команды из каталога, называемого командами, который содержит файлы, названные в честь команды, все из которых содержат команды сервера, используемые для составления этой команды. Например, следующий фрагмент из файла, который определяет команду "tell":

tell <1> <sender> says: <2>

Внутри, обертка читает stdout процесса сервера, ища указания, что пользователь выполняет команду. Затем он разбивает команду вверх, беря с нее имя "отправитель", которое, очевидно, является человеком, который отправил команду "команда", которая представляет собой строку с одним словом, указывающую команду, и список, называемый args, который содержит аргументы следуя командной строке. Например, синтаксисом команды tell является следующее:

tell jim hello

Это приводит к следующим именам:

sender = s0lder
command = tell
args = ['jim', 'hello']

Мой вопрос заключается в том, что, предположив приведенные выше примеры, как я могу сделать финальную строку, скажем, "output", читайте:

tell jim s0lder says: hello

Мне нужен способ в основном, чтобы заменить области, окруженные скобками в строке определения, соответствующими именами/элементами списка args, чтобы:

<sender> = sender
<1> = args[0]
<2> = args[1]

и т.д. для всех элементов в списке args. Спасибо.

  • 0
    Опубликуйте код, который вы уже пробовали, и как это не удалось
Теги:
list
substitution

2 ответа

0
Лучший ответ

Если вы можете немного изменить строки формата, встроенная функция format должна быть достаточно:

args = ["jim", "hello"]
kwargs = {"sender": "s0lder"}
print("tell {0} {sender} says: {1}".format(*args, **kwargs))

выходы

tell jim s0lder says: hello
1

Вот решение, которое не требует изменения формата (все это делается программно).

sender = 's0lder'
args = ['jim', 'hello']

format = "tell <1> <sender> says: <2>".replace("<", "%(<").replace(">", ">)s")
# format == 'tell %(<1>)s %(<sender>)s says: %(<2>)s'
subs = {"<sender>": sender, "<1>": args[0], "<2>": args[1]}
print format % subs
# 'tell jim s0lder says: hello'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню