Вот как это сделать.
import sys
def shell_print(txt, *args):
out = txt.split("%s")
# vars = [*args] # See comments
vars = list(args)
for t in out:
sys.stdout.shell.write(t)
if vars:
v = vars.pop(0)
sys.stdout.shell.write(*v)
my_name = ("Bob", "STRING")
friends_name = ("Jeff", "KEYWORD")
question = "My name is %s in green and my friend's name is %s in red"
shell_print(question, my_name, friends_name)
Это только QAD (быстрый и грязный) решение, и будет только с "%s"
, но его начало. Таким образом, первым параметром является строка, содержащая владельцы мест %s
, следующие параметры (любое их число) - это переменные с их атрибутами.
EDIT: Основной принцип заключается в том, что первое мы берем строку в txt
и разделить его вокруг %s
-х, так что мы остались с (в данном примере) список, как это (out
):
["My name is ", "in green and my friend's name is", "in red"]
Затем мы прокручиваем (итерируем) этот список. Напишем следующий элемент out
, затем посмотрим на первый элемент в args
, который является кортежем. Предполагая, что есть один, мы передаем эти два элемента кортежа в write()
.
sys.stdout.shell.write(*v)
*
делает распаковке, то есть, если есть два элемента кортежа называется v
то она будет проходить два аргумента.
Мы преобразовали args
в список, чтобы мы могли pop()
элементов. Метод pop(0)
удаляет элемент из списка, возвращая его. Поэтому каждый раз, когда мы обходим цикл, мы всегда получаем первый элемент в списке.
Кстати, мы «выскакиваем» из передней части списка (это нуль), что является неэффективным (более эффективным для попса с конца). Но список будет небольшим, так что это не имеет большого значения.
второй EDIT:
Улучшенная версия, включая дополнительные испытания:
import sys
def shell_print(txt, *args):
shell = sys.stdout.shell
out = txt.split("%s")
argc = len(args)
for i, t in enumerate(out):
shell.write(t)
if i < argc:
sargs = (str(args[i][0]), args[i][1])
shell.write(*sargs)
my_name = ("Bob", "STRING")
friends_name = ("Jeff", "KEYWORD")
question = "My name is %s in green and my friend's name is %s in red\n"
shell_print(question, my_name, friends_name)
# Test all tags
valid_tags = {"COMMENT","KEYWORD","BUILTIN","STRING","DEFINITION","SYNC",
"TODO","ERROR"}
for tag in valid_tags:
shell_print("\n", (tag, tag))
# Other types
my_num = (1234, "STRING")
my_float = (3.142, "COMMENT")
text = "\nMy number: %s, My float: %s\n"
shell_print(text, my_num, my_float)
'my_name = shell.write ("Боб", "STRING")' дает 3, потому что 'записи()' возвращает количество написанных символов («Боб» - 3 символа). – cdarke
О, хорошо, если я использовал 'my_name = shell.write (« Бобби »,« STRING »)' он вернул бы 5 @cdarke –
Кроме того, когда я определяю его так, он печатает Бобби в зеленом цвете. Я даже не просил его ничего печатать –