SORU
21 Kasım 2008, Cuma


Functools şeyi yapar.ne sarar?

answer to another question hakkında bir yorum biri functools ne olduğundan emin olmadığını söyledi.sarar yapıyordu. Functools yapar.gelecekte başvurmak için StackOverflow üzerinde bir kaydı olacak ki, bu soruyu soruyorum: sarar, tam olarak?

CEVAP
21 Kasım 2008, Cuma


Bir dekoratör kullandığınızda, başka bir işlevi yerine geçiyorsun. Diğer bir deyişle, Eğer bir dekoratör varsa

def logged(func):
    def with_logging(*args, **kwargs):
        print func.__name__   " was called"
        return func(*args, **kwargs)
    return with_logging

sonra derken

@logged
def f(x):
   """does some math"""
   return x   x * x

tam olarak aynı diyor

def f(x):
    """does some math"""
    return x   x * x
f = logged(f)

ve fonksiyonu f fonksiyonu with_logging ile değiştirilir. Ne yazık ki, bu o zaman derseniz anlamına gelir

print f.__name__

bu yeni fonksiyonun adını çünkü with_logging yazacaktır. Eğer f için Fibonacci sayıları bakarsanız aslında, with_logging yok, kütüphane var, ve yazdığın Fibonacci sayıları artık orada olmayacak çünkü boş olacaktır. Ayrıca, eğer sen bir bak pydoc sonuç için bu işlevi olmayacak listelenen alarak bir argüman x; yerine olacak listelenmiş olarak alma *args **kwargs çünkü ne with_logging alır.

Eğer bir dekoratör kullanarak her zaman bir işlevi hakkında bu bilgileri kaybetme eğer demek, ciddi bir sorun olurdu. functools.wraps var. Bu fonksiyon bir dekoratör kullanılan alır ve İşlev Adı, Fibonacci sayıları, değişkenleri listesi, vb kopyaladıktan işlevselliği ekler. wraps kendisi bir mimar olduğundan, aşağıdaki kodu doğru şey yapıyor

from functools import wraps
def logged(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print func.__name__   " was called"
        return func(*args, **kwargs)
    return with_logging

@logged
def f(x):
   """does some math"""
   return x   x * x

print f.__name__  # prints 'f'
print f.__doc__   # prints 'does some math'

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • edwin maldonado

    edwin maldon

    28 Mart 2009
  • Justin Case

    Justin Case

    3 EKİM 2011
  • thepoke64738

    thepoke64738

    17 HAZİRAN 2011