Я создаю оболочку для сервера 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. Спасибо.
Если вы можете немного изменить строки формата, встроенная функция format
должна быть достаточно:
args = ["jim", "hello"]
kwargs = {"sender": "s0lder"}
print("tell {0} {sender} says: {1}".format(*args, **kwargs))
выходы
tell jim s0lder says: hello
Вот решение, которое не требует изменения формата (все это делается программно).
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'