2016-09-08 30 views
5

Mam funkcję, która może tylko zwrócić a, b lub c wszystkie z nich są typu T, ale chcę zrobić część jego podpis ten fakt ze względu na szczególne znaczenie mają one w kontekście funkcji, jak robię że?co to jest poprawny sposób typu podpowiedź funkcji, która zwraca tylko określony zestaw wartości?

obecnie używam tego

def fun(...) -> "a or b or c": 
    #briefly explain the meaning of a, b and c in its docstring 

jest poprawny?

wiem, że mogę to zrobić

def fun(...) -> T: 
    #briefly explain the meaning of a, b and c in its docstring 

ale jak powiedziałem, że chcemy wyrazić w podpisie, że tylko funkcja powrotu tych szczególnych wartościach

+0

Dlaczego nie utworzyć wyliczenia tych konkretnych wartości, a następnie określić, że typem zwrotu jest to wyliczenie? –

Odpowiedz

9

Nie można określić, że funkcja zwraca tylko podzestaw wartości typu za pomocą samego podpowiedzi typu. Jak sama nazwa wskazuje, typem podpowiedzi jest około typów nie wartości.

Można jednak utworzyć nowy podtyp enum.Enum, który ma tylko wartości, które zamierzasz zwrócić i używać ich w funkcji. Następnie możesz wpisać podpowiedź, że zwracasz typ wyliczeniowy.

import enum 

class cmp_results(enum.IntEnum): 
    less = -1 
    equal = 0 
    greater = 1 

def my_cmp_function(x, y) -> cmp_results: 
    if x < y: return cmp_results.less 
    elif x == y: return cmp_results.equal 
    else: return cmp_results.greater 

To może być przesada. Po prostu podpowiedź int, ponieważ typ zwracany (i dokumentowanie określonych wartości) jest prawdopodobnie wystarczająco dobry.

+4

Nie sądzę, żeby to było przesadą. Wręcz przeciwnie, jest to jedna z korzyści statycznego sprawdzania typu: możesz podać * dokładnie *, co funkcja może zwrócić. Fakt, że "mniej", "równy" i "większy" są jedynie aliasami garści wartości "int", jest szczegółem implementacji. (A wybrane wartości nie miałyby znaczenia, gdybyś nie chciał skorzystać z partycji negatywnej/zero/pozytywnej, która jest już obsługiwana przez typ 'int'.) – chepner

+0

ten pomysł enum wygląda interesująco, i ma dodane bonus, który mogę zrobić shenanigans z nim, aby manipulować wyjściem, gdy jest nazywane pomocą dla ładnej dokumentacji – Copperfield

0

Jeśli wszystkie są tego samego dokładnego typu tylko dodać, że jako typ zwracany:

def func(...) -> T: # or int or whatever else 

chcę wyrazić w podpisie, że tylko funkcja zwraca te konkretne wartości

Rodzaj podpowiedzi nie podać nazwę lub wartość po prostu określić typ; tester typu próbuje działać na typu, które zostało dostarczone.

Jeśli robisz to tylko w celach dokumentacyjnych, dodaj do niego 'a or b or c ", jeśli chcesz; użytkownicy to zrozumieją, ale sprawdzacze typu: nie będą i na pewno nie będą działać.

+0

* wszystkie z nich są typu 'T' * –

+0

wszystkie z nich są tego samego typu, na przykład funkcja zwraca tylko' 1' lub '-1' lub' 0' – Copperfield

+1

@Jim - niestety, to nie jest ' coś, co można zrobić za pomocą adnotacji typu PEP 484. W stopniowym systemie typów Pythona (a także w większości systemów typów) można dodawać tylko adnotacje stwierdzające, że zwracana jest wartość określonego _type_ - nie można ograniczyć wartości wyjściowej _value_ typu. Istnieją systemy typu, które pozwalają to zrobić (np. [Typy zależne] (https://en.wikipedia.org/wiki/Dependent_type)), ale obecnie PEP 484 nie obsługuje typów zależnych. – Michael0x2a