SORU
22 Mart 2010, PAZARTESİ


Python parametre türleri işlevi

Yanılmıyorsam, Python fonksiyon oluşturma bu gibi çalışır:

def my_func(param1, param2):
    # stuff

Ancak, aslında bu parametre türleri vermeyin. Eğer yanlış hatırlamıyorsam, ayrıca, Python güçlü bir yazılı dil, gibi, Python, farklı türde bir parametre olarak işlev yaratıcısı beklenenden daha iyi olmaz gibi görünüyor. Ancak, nasıl Python fonksiyonu kullanıcı doğru pas çeşitleri olduğunu biliyor mu? Program sadece yanlış türü varsa, bu işlev aslında parametre kullanır varsayarak ölecek mi? Türünü belirtmek zorunda mısın?

CEVAP
27 Ocak 2014, PAZARTESİ


Diğer cevaplar ördek yazarak ve tzot basit cevabı açıklayan iyi bir iş yapmış:

Python değişkenleri gibi diğer dillerde değişken bir tip olduğu ve değeri yok; isimleri kendi türünü bilmediğiniz nesneleri işaret vardır.

Ancakilginç bir şey, 2010 yılından bu yana değişti soru ilk sorulduğunda. PEP 3107 implementaion ile Şimdi aslında bir öznitelik türü ve böyle değeri: dönüş türü belirtebilirsiniz

def pick(l: list, index: int) -> int:
    return l[index]

pick 2 parametre, 8 ** bir listesi ve bir tam sayı index alır burada görebiliriz. Ayrıca bir tamsayı döndürmesi gerekir.

Yani burada ima l listesi tamsayılar hangi görebiliriz olmadan fazla çaba, ama daha karmaşık fonksiyonları olması biraz kafa karıştırıcı olarak ne listesi içermelidir. Biz de index varsayılan değer 0 olmasını istiyorum. pick yazmak için seçebilirsiniz bunu çözmek için böyle yerine:

def pick(l: "list of ints", index: int = 0) -> int:
    return l[index]

Ama ÖNEMLİ NOT Bu Python alışkanlık zam TypeError iletirseniz bir şamandıra içine index, bu nedenle bu ana noktaları Python tasarım felsefesi: "hepimiz yetişkin burada" demek ki, siz farkında olun ne yapabilirsiniz geçirmek için bir işlevi ve ne yapabilirsiniz yok. Eğer gerçekten tür güvenli kod yazmak istiyorsanız isinstance işleve geçirilen bağımsız değişken doğru veya yazın böyle bir alt sınıfı olduğunu kontrol etmek için kullanabilirsiniz:

def pick(l: list, index: int = 0) -> int:
    if not isinstance(l, list):
        raise TypeError
    return l[index]

PEP 3107 sadece kod okunabilirliği artırmak değil, aynı zamanda here hakkında okuyabileceğiniz birkaç uydurma usecases vardır.

Python 3.5 bu tür ipuçları/notlar için standart bir modül tanıtır, PEP 484 giriş ile daha fazla ilgi var.

Ayrıca sözdizimi geliştirme mypy (GitHub) aracı isteğe bağlı statik tür denetimi (PEP 484 uyumlu) için kullanılır.


Daha önce bir belgelenen Python örnek Sphinx ile kod benzer işlevler docstrings bu gibi biçimlendirilmiş yazarak elde edilebilir:

def pick(l, index):
    """
    :param l: list of integers
    :type l: list
    :param index: index at which to pick an integer from *l*
    :type index: int
    :returns: integer at *index* in *l*
    :rtype: int
    """
    return l[index]

Ancak, bu işlemin birkaç ekstra satırları, tam sayısı bağlıdır ne kadar açık olmak istiyorsun ve nasıl biçimlendirmek için kütüphane ama öyle olmalı temizlemek için nasıl PEP 3107 sağlar bir alternatif olduğunu pek çok yönden üstün. Bu arada PEP 484 açık, esnek ve hassas olan tür ipuçları/notlar bunlar için bir sözdizimi tanımlayan standart bir modül sağlar.


Ağır ima türü kullanan Python kod örneği here bulunabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ludique

    Ludique

    21 NİSAN 2009
  • MotoManTV

    MotoManTV

    10 Aralık 2009
  • xSammyJoe1

    xSammyJoe1

    19 Temmuz 2011