2010-11-08 19 views
15

Python'da bir lambda işlevi üzerinde bir dekoratör kullanmak için herhangi bir sözdizimi var mı? Örnek: Bu çıktıdaPython'da lambdalarda dekoratörler kullanılıyor mu?

def simpledecorator(f): 
    def new_f(): 
     print "Using a decorator: " 
     f() 
    return new_f 

@simpledecorator 
def hello(): 
    print "Hello world!" 

Sonuçlar: Henüz

>>> hello() 
Using a simple decorator: 
Hello world! 

Bir lambda ile aynı deneyin:

File "<stdin", line 2 
    f = lambda x: x * 2 
    ^
SyntaxError: invalid syntax 

I:

@anotherdecorator 
f = lambda x: x * 2 

Ben bu olsun bu lambdas yapmak için iyi bir yol olabilir gibi hissediyorum ifadelerin bunlara "enjekte" edilmesine izin vererek daha çok yönlü. Ama böyle bir özellik varsa, sözdiziminin ne olduğunu bilmiyorum.

cevap

29
f = anotherdecorator(lambda x: x * 2) 
+5

Tam olarak. Dekoratörlerin nasıl çalıştığını biliyorsan çok açık. Eğer yapmazsan, muhtemelen onları yazmamalısın. – delnan

+1

Keşke bunu daha önce düşünmüştüm. '@ Dekoratör 'sözdiziminin savaşmaya çalıştığı durumdan (yani, f = başka bir denetleyici (f)) kaçınır. Yine de, bu çok kullanışlı bir dil özelliğidir. –

+5

'@' sözdiziminden önce, böyle bir şey bir işlevi (veya sınıfı) süslemenin ana yoluydu. – martineau

İlgili konular