2016-11-05 5 views
2

J'ai actuellement déjà défini le code:impression en couleur à partir d'une variable

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) 

Je suis en train de réaliser une sortie de:

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

Et dans la sortie le mot Bob est vert et Jeff est rouge.

Cependant le code que je donne simplement essayé une sortie de:

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

Je ne sais que juste en tapant shell.write("Bob", "STRING") œuvres, mais qui prend trop de lignes de code si vous avez besoin d'imprimer plus de choses en couleur.

J'ai aussi essayé de faire

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

Mais lorsque vous imprimez qu'il produit juste 3

je besoin d'une réponse de la façon d'atteindre la sortie, et aussi pourquoi il sorties 3 lors de l'impression

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

Je voudrais aussi savoir pourquoi elle imprime aussi étrangement B obby 'en vert après avoir été défini comme ci-dessus

PS. Je suis sur une machine Windows avec python 3.4.3

+0

'my_name = shell.write ("Bob", "STRING")' 'donne 3 parce que write()' retourne la nombre de caractères écrits ("Bob" est de 3 caractères). – cdarke

+0

Oh ok donc si j'ai utilisé 'my_name = shell.write (" Bobby "," STRING ")' il retournera 5 @cdarke –

+0

Aussi, quand je le définis comme ça, il imprime Bobby en vert. Je ne lui ai même pas demandé d'imprimer quoi que ce soit –

Répondre

1

Voici une façon de le faire.

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) 

Il est seulement une solution QAD (rapide et sale), et ne pour "%s" avec, mais son début. Donc, le premier paramètre est la chaîne contenant les %s placeholders, les paramètres suivants (un certain nombre d'entre eux) sont les variables, avec leurs attributs, à insérer.

EDIT: Le principe de base est que d'abord, nous prenons la chaîne dans txt et divisé autour des %s « s, donc il nous reste (dans l'exemple) une telle liste (out):

["My name is ", "in green and my friend's name is", "in red"] 

Ensuite, nous parcourons (itérons) cette liste. Nous écrivons l'élément suivant de out puis examinons le premier élément de args, qui est un tuple. En supposant qu'il y en ait un, nous passons ces deux éléments de tuple à write().

sys.stdout.shell.write(*v) 

Le *-t DÉBALLAGE, qui est, s'il y a deux éléments dans le tuple appelé v alors il passera deux arguments. Nous avons converti le args en une liste afin que nous puissions pop() les éléments. La méthode pop(0) supprime un élément de la liste, renvoyant ce qu'il a supprimé. Donc, chaque fois que nous faisons le tour de la boucle, nous obtenons toujours le premier élément de la liste.Par ailleurs, nous sommes en train de "sauter" du début de la liste (c'est le zéro), ce qui est inefficace (plus efficace pour apparaître à partir de la fin). Mais la liste sera petite donc ce n'est pas un gros problème.

2ème EDIT:

Version améliorée, y compris des tests supplémentaires:

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

Hmmm il dit juste erreur –

+0

avec le vars = [* args] bit –

+0

Quelle version de python? Quelle est l'erreur? – cdarke