2016-09-12 29 views
6

Jaka jest różnica korzystania List, Tuple itd od typing modułu:Używanie listy/Tuple/etc. od wpisując vs bezpośrednio odnosząc typ jako listy/krotki/etc

from typing import Tuple 

def f(points: Tuple): 
    return map(do_stuff, points) 

W przeciwieństwie do odnoszące się do typów Pythona bezpośrednio:

def f(points: tuple): 
    return map(do_stuff, points) 

A kiedy powinienem użyć jednego na drugim?

+0

Pierwsza z nich wygląda dużo lepiej na podświetlaniu składni SO! –

+0

Daj to przeczytać, zacząłem zadawać to samo pytanie, które miałeś, zanim to przeczytam. https://docs.python.org/3/library/typing.html – MooingRawr

+0

[Tuple, używany przez listę typów elementów. na przykład Tuple \ [int, int, str \]] (https://www.python.org/dev/peps/pep-0484/#the-typing-module) – Kasramvd

Odpowiedz

18

typing.Tuple i typing.ListGeneric types; Oznacza to można określić, co wpisać swoje zawartość musi być:

def f(points: Tuple[float, float]): 
    return map(do_stuff, points) 

ten określa, że ​​krotka przekazany musi zawierać dwa float wartości. Nie można tego zrobić za pomocą wbudowanego typu tuple.

typing.Tuple jest tutaj szczególny, ponieważ pozwala określić określoną liczbę oczekiwanych elementów i typ każdej pozycji. Użyj elipsy, jeśli długość nie jest ustawiona, a typ powinien zostać powtórzony: Tuple[float, ...] opisuje zmienną długość tuple z float s.

W przypadku typing.List i innych typów sekwencji zazwyczaj określa się tylko typ dla wszystkich elementów; List[str] to lista ciągów o dowolnym rozmiarze. Zauważ, że funkcje powinny przyjmować jako argumenty type.Sequence, a typ typing.List jest zwykle używany tylko w przypadku typów zwracanych; ogólnie rzecz biorąc większość funkcji wykonywałaby dowolną sekwencję i tylko iterowała, ale gdy zwrócisz list, naprawdę powracasz do określonego, zmiennego typu sekwencji.

Powinieneś zawsze wybierać typy ogólne typing, nawet jeśli obecnie nie ograniczasz zawartości. Łatwiej jest dodać to ograniczenie późniejszym typem, ponieważ wynikowa zmiana będzie mniejsza.