Sök…


Syntax

  • att skriva.Kallabar [[int, str], Ingen] -> def func (a: int, b: str) -> Ingen
  • att skriva.Mappning av [str, int] -> {"a": 1, "b": 2, "c": 3}
  • att skriva.Lista [int] -> [1, 2, 3]
  • att skriva.Set [int] -> {1, 2, 3}
  • att skriva. Valfritt [int] -> Inget eller int
  • att skriva.Sekvens [int] -> [1, 2, 3] eller (1, 2, 3)
  • att skriva.Any -> Vilken typ som helst
  • att skriva.Union [int, str] -> 1 eller "1"
  • T = typ.TypeVar ('T') -> Generisk typ

Anmärkningar

Typ Hinting, som specificeras i PEP 484 , är en formaliserad lösning för att statiskt ange typen av ett värde för Python Code. Genom att uppträda tillsammans med typing typ-tips ger Python användare möjlighet att kommentera sin kod och därigenom hjälpa typ pjäser medan indirekt dokumentera sin kod med mer information.

Generiska typer

typing.TypeVar är en generisk fabrik. Det huvudsakliga målet är att fungera som en parameter / platshållare för generiska funktion / klass / metodanteckningar:

import typing

T = typing.TypeVar("T")

def get_first_element(l: typing.Sequence[T]) -> T:
    """Gets the first element of a sequence."""
    return l[0]

Lägga till typer till en funktion

Låt oss ta ett exempel på en funktion som får två argument och returnerar ett värde som anger deras summa:

def two_sum(a, b):
    return a + b

Genom att titta på den här koden kan man inte säkert och utan tvekan ange typen av argument för funktion two_sum . Det fungerar båda när det levereras med int värden:

print(two_sum(2, 1))  # result: 3

och med strängar:

print(two_sum("a", "b"))  # result: "ab"

och med andra värden, såsom list s, tuple s et cetera.

På grund av denna dynamiska karaktär av pytontyper, där många är tillämpliga för en given operation, skulle alla typkontroller inte kunna rimligt säga om ett samtal för denna funktion ska tillåtas eller inte.

För att hjälpa vår typkontroll kan vi nu tillhandahålla typtips för den i funktionsdefinitionen som anger vilken typ vi tillåter.

För att indikera att vi bara vill tillåta int typer kan vi ändra vår funktionsdefinition så att den ser ut:

def two_sum(a: int, b: int):
    return a + b

Anteckningar följer argumentets namn och separeras med ett : -tecken.

På samma sätt, för att ange endast str typer är tillåtna, skulle vi ändra vår funktion för att ange den:

def two_sum(a: str, b: str): 
    return a + b

Förutom att ange typen av argument kan man också ange returvärdet för ett funktionssamtal. Detta görs genom att lägga till tecknet -> följt av typen efter den avslutande parentesen i argumentlistan men före : i slutet av funktionsdeklarationen:

def two_sum(a: int, b: int) -> int: 
    return a + b

Nu har vi angett att returvärdet när du ringer two_sum borde vara av typen int . På liknande sätt kan vi definiera lämpliga värden för str , float , list , set och andra.

Även om typtips oftast används av typkontroller och IDE: er, kan du ibland behöva hämta dem. Detta kan göras med hjälp av specialattributet __annotations__ :

two_sum.__annotations__
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}

Klassmedlemmar och metoder

class A:
    x = None  # type: float
    def __init__(self, x: float) -> None:
        """
        self should not be annotated
        init should be annotated to return None
        """
        self.x = x
    
    @classmethod
    def from_int(cls, x: int) -> 'A': 
        """
        cls should not be annotated
        Use forward reference to refer to current class with string literal 'A'
        """
        return cls(float(x))

Framåtreferens av den aktuella klassen behövs eftersom anteckningar utvärderas när funktionen definieras. Framåtreferenser kan också användas när man hänvisar till en klass som kan orsaka en cirkulär import om den importeras.

Variabler och attribut

Variabler kommenteras med hjälp av kommentarer:

x = 3  # type: int
x = negate(x)
x = 'a type-checker might catch this error'
Python 3.x 3.6

Från Python 3.6 finns det också ny syntax för variabla kommentarer . Koden ovan kan använda formuläret

x: int = 3

Till skillnad från kommentarer är det också möjligt att bara lägga till en typtipp till en variabel som inte tidigare förklarats utan att sätta ett värde till det:

y: int

Om dessa används i modulen eller typing.get_type_hints(class_or_module) hämtas med typing.get_type_hints(class_or_module) :

class Foo:
    x: int
    y: str = 'abc'

print(typing.get_type_hints(Foo))
# ChainMap({'x': <class 'int'>, 'y': <class 'str'>}, {})

Alternativt kan de nås med hjälp av specialvariablen __annotations__ eller attribut:

x: int
print(__annotations__)
# {'x': <class 'int'>}

class C:
    s: str
print(C.__annotations__)
# {'s': <class 'str'>}

NamedTuple

Skapa en namedtuple med typ tips sker med funktions NamedTuple från typing

import typing
Point = typing.NamedTuple('Point', [('x', int), ('y', int)])

Observera att namnet på den resulterande typen är det första argumentet till funktionen, men det bör tilldelas en variabel med samma namn för att underlätta arbetet med typkontroller.

Skriv tips för sökordsargument

def hello_world(greeting: str = 'Hello'):
    print(greeting + ' world!')

Notera mellanrummen runt lika tecknet i motsats till hur sökordsargument vanligtvis utformas.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow