2017-03-19 6 views
1

私はこの質問に正しく言い方をすることさえ知らない(この話題が以前に議論されたか、どのように質問するのか分からない)。
以下のコードは、私に心配するものを返します。 これはデコレータの練習です。これは特に、デコレータが文字列の最初と最後にどのようにHTMLタグを追加できるかを示すために作成されたものです。 私はデコレータ使用して文字列を返す関数を呼び出すことだった場合: @AddTags(「P」、「i」はを、「B」) 戻り値は言っている: 「PIBを *私のブログへようこそジョー!* BIPデコレータをPython 3で使用していると、困った結果が出る

それはどのようにループためは、すべての値を持つ単一の1行を返すことです。 「が逆転が使用されていないと、結果は後方にありますか? 私はDecoratorsのコンセプトを理解し始めていますが、この例は純粋な魔法のようなものです...これはどのように機能しますか?

def AddTags(*tags): 
    def decorator(oldFunc): 
     def inside(*args, **kwargs): 
      code = oldFunc(*args, **kwargs) 
      for tag in reversed(tags): 
       code = "<{0}>{1}</{0}>".format(tag,code) 
      return code 
     return inside 
    return decorator 
@AddTags("p","i","b") 
def MyWebWelcome(name): 
    return "Welcome "+name+" To my blog!" 
+2

これはデコレータとは関係ありません。リストを繰り返し、文字列を補間し、次の反復で結果を使用するだけです。 –

+0

インデントを修正し、これを実行可能な例にして、その出力を表示して質問を示すことはできますか? – tdelaney

答えて

1

魔法は、そのだけではcode = "<{0}>{1}</{0}>".format(tag,code)自体の拡大バージョンでcodeを更新し続けています。ループのタグを逆にすることで、一番右のタグが最初に追加され、次に次のタグでラップされるようになります。

def AddTags(*tags): 
    def decorator(oldFunc): 
     def inside(*args, **kwargs): 
      code = oldFunc(*args, **kwargs) 
      for tag in reversed(tags): 
       print('code:', code) 
       code = "<{0}>{1}</{0}>".format(tag,code) 
      return code 
     return inside 
    return decorator 

@AddTags("p","i","b") 
def MyWebWelcome(name): 
    return "Welcome "+name+" To my blog!" 

print('result:', MyWebWelcome('foo')) 

code: Welcome foo To my blog! 
code: <b>Welcome foo To my blog!</b> 
code: <i><b>Welcome foo To my blog!</b></i> 
result: <p><i><b>Welcome foo To my blog!</b></i></p> 

のいずれかのデコレータについての魔法の何を印刷します:あなたはprint文のカップルと進行状況を確認することができます。

>>> code = "foo" 
>>> for tag in ("p", "i", "b"): 
...  print(code) 
...  code = "<{0}>{1}</{0}>".format(tag,code) 
... 
foo 
<p>foo</p> 
<i><p>foo</p></i> 
>>> code 
'<b><i><p>foo</p></i></b>' 
+0

私は今どのように動作するかを理解しています。私は尋ねるのは馬鹿だと思っていましたが、当時は私の頭の中で「コンピューティング」していませんでした。助けてくれてありがとう。 – solid

関連する問題