2016-11-05 5 views
2

я в настоящее время код:Печать в цвете с уже определенной переменной

import sys 

shell = sys.stdout.shell 

my_name = ("Bob", "STRING") 
friends_name = ("Jeff", "KEYWORD") 
question = ("My name is %s in green and my friend's name is %s in red" % (my_name, friends_name)) 
shell.write(question) 

Я пытаюсь добиться выхода:

My name is Bob in green and my friend's name is Jeff in red. 

И на выходе слово Bob зеленый и Jeff красный.

Однако код, который я пытался просто дает выход:

My name is ('Bob', 'STRING') in green and my friend's name is ('Jeff', 'KEYWORD') in red 

Я знаю, что просто набрав shell.write("Bob", "STRING") работы, но это занимает слишком много строк кода, если вам нужно напечатать больше вещей в цвете.

Я также пытался сделать

my_name = shell.write("Bob", "STRING") 

Но при печати, что он просто выводит 3

Мне нужен ответ, как добиться вывода, а также почему он выводит 3 при печати

my_name = shell.write("Bob", "STRING")

Я также хотел бы знать, почему это странно также B печатает» obby 'в зелени после определения, как указано выше

PS. Я на машине с Windows с python. 3.4.3.

+0

'my_name = shell.write ("Боб", "STRING")' дает 3, потому что 'записи()' возвращает количество написанных символов («Боб» - 3 символа). – cdarke

+0

О, хорошо, если я использовал 'my_name = shell.write (« Бобби »,« STRING »)' он вернул бы 5 @cdarke –

+0

Кроме того, когда я определяю его так, он печатает Бобби в зеленом цвете. Я даже не просил его ничего печатать –

ответ

1

Вот как это сделать.

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) 
+0

Хм, это просто говорит об ошибке –

+0

с vars = [* args] bit –

+0

Какая версия python? Какая ошибка? – cdarke

Смежные вопросы