2016-11-05 4 views
2

私は現在、コードを持っている印刷は

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

をし、出力に言葉Bobが緑色で、 Jeffは赤です。私はちょうどshell.write("Bob", "STRING")作品を入力していることを知っていますが、あなたは色でより多くのものを印刷する必要がある場合には、コードの、あまりにも多くの行を取り

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

:私が試したコードは、単にの出力を与えるしかし

私も

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

を行うことを試みている。しかし、あなたはそれだけで3

を出力することを印刷するとき

を印刷するとき、それは 3を出力し、なぜ私はまた、出力を達成するためにどのように答えを必要とし、

私はまた、「B上記のように定義されると緑色で表示されます。

PS。私はPythonでWindowsマシン上にいる3.4.3

+0

'ライト()'返すため 'MY_NAME = shell.write( "ボブ"、 "STRING")は' 3を与えます書き込まれた文字数(「Bob」は3文字)。 – cdarke

+0

ああ、私が 'my_name = shell.write(" Bobby "、" 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の最初の要素を参照してください。タプルです。 1つがあると仮定すると、2つのタプル要素をwrite()に渡します。

sys.stdout.shell.write(*v) 

*は開梱を行い、それがv呼ばれるタプル内の2つの要素がある場合、それは、2つの引数を渡すであろう、です。

argsをリストに変換しました。pop()という要素があります。 pop(0)メソッドは、リストから要素を削除し、削除した要素を返します。ループの周りを回るたびに、常にリストの最初の要素が得られます。

ちなみに、私たちはリストの先頭から「ポップ」しています(それはゼロです)。非効率的です(最後からポップする方が効率的です)。しかし、リストは小さいので大したことではありません。

2 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

Hmmmそれだけでエラー –

+0

とvars = [* args]ビット –

+0

Pythonのどのバージョン?エラーは何ですか? – cdarke