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)
'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
Oh ok donc si j'ai utilisé 'my_name = shell.write (" Bobby "," STRING ")' il retournera 5 @cdarke –
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 –