SORU
14 AĞUSTOS 2009, Cuma


Python 3 ve statik yazma

Çok isterdim kadar dikkat 3 Python geliştirme için para vermedim, sadece ve sadece yeni sözdizimi bazı ilginç değişiklikler fark ettim. this SO answer özel fonksiyonu parametre ek açıklama:

def digits(x:'nonnegative number') -> "yields number's digits":
    # ...

Bu konuda hiçbir şey bilmeden, belki Python statik yazarak uygulama için kullanılabilir diye düşündüm!

Sonra bazı arıyor, fıstıklı bir sürü tartışma ile ilgili (tamamen isteğe bağlı) statik yazarak Python gibi söz PEP 3107 "Adding Optional Static Typing to Python" (part 2)

..ama, bu iş ne kadar ilerlemiştir anlamış değilim. Statik yazarak, parametre-açıklama kullanarak herhangi uygulamaları var mı? Parametrik tip fikirlerin herhangi bir Python 3 girer mi?

CEVAP
14 AĞUSTOS 2009, Cuma


Kodumu okuduğunuz için teşekkür ederim!

Gerçekten de zor değil Python genel açıklama, bir kiralık katil yaratmak. Burada benim almak:

'''Very simple enforcer of type annotations.

This toy super-decorator can decorate all functions in a given module that have 
annotations so that the type of input and output is enforced; an AssertionError is
raised on mismatch.

This module also has a test function func() which should fail and logging facility 
log which defaults to print. 

Since this is a test module, I cut corners by only checking *keyword* arguments.

'''

import sys

log = print


def func(x:'int' = 0) -> 'str':
    '''An example function that fails type checking.'''
    return x


# For simplicity, I only do keyword args.
def check_type(*args):
    param, value, assert_type = args
    log('Checking {0} = {1} of {2}.'.format(*args))
    if not isinstance(value, assert_type):
        raise AssertionError(
            'Check failed - parameter {0} = {1} not {2}.'
            .format(*args))
    return value

def decorate_func(func):    
    def newf(*args, **kwargs):
        for k, v in kwargs.items():
            check_type(k, v, ann[k])
        return check_type('<return_value>', func(*args, **kwargs), ann['return'])

    ann = {k: eval(v) for k, v in func.__annotations__.items()}
    newf.__doc__ = func.__doc__
    newf.__type_checked = True
    return newf

def decorate_module(module = '__main__'):
    '''Enforces type from annotation for all functions in module.'''
    d = sys.modules[module].__dict__
    for k, f in d.items():
        if getattr(f, '__annotations__', {}) and not getattr(f, '__type_checked', False):
            log('Decorated {0!r}.'.format(f.__name__))
            d[k] = decorate_func(f)


if __name__ == '__main__':
    decorate_module()

    # This will raise AssertionError.
    func(x = 5)

Bu basitliği göz önüne alındığında, bu şey ana değil ki ilk görüşte garip. Ancak, bunun bir nedeni olduğuna inanıyorumgöründüğü kadar kullanışlı değil. Genel olarak, tip denetimi ve sözlük tamsayı eklerseniz, büyük ihtimalle bazı belirgin hata yaptın çünkü yardımcı olur (ve eğer bir şey mantıklı olsan, yine dedaha iyi örtülü daha açık olması için).

Ama gerçek hayatta sık sık aynı miktarda karıştırınbilgisayar türüderleyici tarafından görülebilir ama açıkça farklı olarakinsan türüörneğin aşağıdaki kod parçasında bariz bir hata içeriyor:

height = 1.75 # Bob's height in meters.
length = len(sys.modules) # Number of modules imported by program.
area = height * length # What's that supposed to mean???

Herhangi bir insan hemen 'insan türü' değişkenleri height length bilgisayar gibi görünüyor olsa bile . bunu bilir sağlanan hat üzerinde bir hata görmelisiniz ^strong>tamamen yasalint float çarpma.

Bu sorunun olası çözümleri hakkında konuştu, ama 'bilgisayar türleri' görünüşe göre yarım-bir çözüm, en azından benim görüşüme göre, bu yüzden . zorlanarak daha var ^em>daha kötü çözüm. Neden aynı sebeptenSistemleri Macarçok kötü bir fikir olsaApps Macarçok kısa bir zaman. Çok bilgilendirici daha varpost of Joel Spolsky.

Şimdi eğer birisi üçüncü taraf kitaplığı Pythonic bir çeşit uygulamak için ise, otomatik olarak, gerçek dünya verileriyle olan atayıninsan türüve sonra bakım width * height -> area böyle bir tür dönüşümü ve işlevi ek açıklamalar ile kontrol uygulamak için aldı, bu tür insanlar gerçekten kullanabilir kontrol olacağını düşünüyorum!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Artorius FullPower

    Artorius Ful

    29 Temmuz 2007
  • iMasterful

    iMasterful

    11 EYLÜL 2009
  • Louis C.K.

    Louis C.K.

    18 HAZİRAN 2006