Diğer cevaplar ördek tipini ve tzot'un basit cevabını açıklamakta iyi bir iş çıkardı :
Python'un değişkenleri yoktur, değişkenlerin türü ve değeri olduğu diğer diller gibi; türlerini bilen nesnelere işaret eden isimleri vardır.
Bununla birlikte , 2010'dan bu yana ilginç bir şey değişti (soru ilk sorulduğunda), yani PEP 3107'nin uygulanması (Python 3'te uygulandı). Şimdi aslında bir parametrenin tipini ve bunun gibi bir fonksiyonun dönüş tipinin tipini belirtebilirsiniz:
def pick(l: list, index: int) -> int:
return l[index]
Burada pick
2 parametre, bir liste l
ve bir tamsayı alır index
. Ayrıca bir tamsayı döndürmelidir.
Yani burada l
çok fazla çaba harcamadan görebileceğimiz bir tamsayı listesi olduğu ima ediliyor , ancak daha karmaşık fonksiyonlar için listenin ne içermesi gerektiği konusunda biraz kafa karıştırıcı olabilir. Ayrıca varsayılan değerinin index
0 olmasını da istiyoruz. Bunu çözmek için pick
bunun gibi yazmayı seçebilirsiniz :
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
Şimdi l
sözdizimsel olarak izin verilen türü olarak bir dize koyduğumuzu unutmayın , ancak programlı olarak ayrıştırmak için iyi değildir (ki daha sonra geri döneceğiz).
Python'un TypeError
bir şamandıra geçirirseniz yükselmeyeceğini belirtmek önemlidir index
, bunun nedeni Python'un tasarım felsefesinin ana noktalarından biridir: "Hepimiz yetişkinleri burada kabul ediyoruz" , yani bir işleve neleri aktarabileceğinizin ve neleri yapamayacağınızın farkında olun. Gerçekten TypeErrors atar kod yazmak istiyorsanız isinstance
, iletilen argümanın uygun türden veya bunun bir alt sınıfından olup olmadığını kontrol etmek için işlevi kullanabilirsiniz :
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
Bunu neden nadiren yapmanız gerektiği ve bunun yerine ne yapmanız gerektiği hakkında daha fazla bilgi bir sonraki bölümde ve yorumlarda ele alınmaktadır.
PEP 3107 sadece kod okunabilirliğini arttırmakla kalmaz, aynı zamanda burada okuyabileceğiniz birkaç uygun kullanım durumuna da sahiptir .
Tip açıklamaları, tip ipuçları için standart bir modül sunan PEP 484'ün tanıtımı ile Python 3.5'te çok daha fazla dikkat çekti .
Bu tip ipuçları , şimdi PEP 484 uyumlu olan tip denetleyicisi mypy'den ( GitHub ) geldi .
Yazma modülü ile birlikte, aşağıdakileri içeren oldukça kapsamlı bir tür ipucu koleksiyonu ile birlikte gelir:
List
, Tuple
, Set
, Map
- için list
, tuple
, set
ve map
sırasıyla.
Iterable
- Jeneratörler için kullanışlıdır.
Any
- ne zaman bir şey olabilir.
Union
- aksine, belirli bir tür kümedeki herhangi bir şey olabileceği zaman Any
.
Optional
- zaman olabilir Yok olmak. İçin kestirme Union[T, None]
.
TypeVar
- jenerik ilaçlarla kullanılır.
Callable
- öncelikle işlevler için kullanılır, ancak diğer callables için kullanılabilir.
Bunlar en yaygın tip ipuçlarıdır. Yazma modülünün belgelerinde tam bir liste bulunabilir .
Yazma modülünde sunulan ek açıklama yöntemlerini kullanan eski örnek:
from typing import List
def pick(l: List[int], index: int) -> int:
return l[index]
Güçlü bir özellik, Callable
bir işlevi bağımsız değişken olarak alan açıklama yöntemleri yazmanıza izin veren özelliktir . Örneğin:
from typing import Callable, Any, Iterable
def imap(f: Callable[[Any], Any], l: Iterable[Any]) -> List[Any]:
"""An immediate version of map, don't pass it any infinite iterables!"""
return list(map(f, l))
Yukarıdaki örnek, TypeVar
bunun yerine kullanımı ile daha kesin hale gelebilir Any
, ancak cevabımı yazım ipucunun etkinleştirdiği harika yeni özellikler hakkında çok fazla bilgi ile doldurduğuma inanıyorum çünkü bu okuyucuya bir alıştırma olarak kaldı.
Önceden, örneğin Sfenks ile bir Python kodu belgelendiğinde , yukarıdaki işlevselliklerden bazıları, şu şekilde biçimlendirilmiş docstrings yazılarak elde edilebilirdi:
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]
Gördüğünüz gibi, bu bir dizi ekstra satır alır (tam sayı ne kadar açık olmak istediğinize ve doktorunuzu nasıl biçimlendirdiğinize bağlıdır). Ancak şimdi, PEP 3107'nin birçok (hepsi?) Yoldan daha üstün bir alternatif sunduğunu açıklığa kavuşturmak gerekir . Bu özellikle , gördüğümüz gibi, bu tip ipuçları / ek açıklamalar için açık ve kesin ancak esnek olacak şekilde kullanılabilecek bir sözdizimi tanımlayan standart bir modül sağlayan PEP 484 ile kombinasyon halinde doğrudur. güçlü kombinasyon.
Kişisel görüşüme göre, bu Python'un şimdiye kadarki en büyük özelliklerinden biri. İnsanların gücünü kullanmaya başlamalarını bekleyemem. Uzun cevap için özür dilerim, ama heyecanlandığımda olan şey bu.
Tip ipuçlarını yoğun şekilde kullanan Python koduna bir örnek burada bulunabilir .