2015-10-09 17 views
5

W niektórych (głównie funkcjonalne) języków można zrobić coś takiego:Jak alias typu w python?

type row = list(datum) 

lub

type row = [datum] 

Tak, że możemy zbudować takie rzeczy:

type row = [datum] 
type table = [row] 
type database = [table] 

Czy istnieje sposób to zrobić w python? Można to zrobić za pomocą klas, ale python ma kilka aspektów funkcjonalnych, więc zastanawiałem się, czy można to zrobić w łatwiejszy sposób.

Odpowiedz

2

Python jest wpisywany dynamicznie. Podczas gdy odpowiedź Łukasza R. jest poprawna dla celów podpowiedzi typu (które z kolei mogą być użyte do analizy statycznej i linting), ściśle rzecz biorąc, nie musisz potrzebujesz, aby zrobić cokolwiek, aby to działało. Wystarczy skonstruować list tak i przypisać je do zmiennych:

foo_table = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
bar_table = ... 
foo_database = [foo_table, bar_table, ...] 

Rodzaj wskazówki są naprawdę przydatne, ponieważ mogą one pomóc dokument jaki kod zachowuje się i mogą być sprawdzane zarówno statycznie i przy starcie. Ale nie musisz nic robić, jeśli jest to niewygodne.

9

Od wersji Python 3.5 można korzystać z modułu typing.

Cytowanie docs, typ alias jest definiowana przez przypisanie typ do aliasu:

Vector = List[float] 

Aby dowiedzieć się więcej na temat egzekwowania typów w Pythonie może chcesz zapoznać się z PEP: PEP483 i PEP484.

Python historycznie używał typowania kaczego zamiast silnego pisania i nie wbudował sposobu wymuszania typów przed wydaniem wersji 3.5.

+0

to jest dokładnie to, czego szukałem, dzięki! – Wysaard

+1

Należy zwrócić uwagę, że wskazówki typów są przeznaczone do analizy statycznej i używania przez linters. Wskazówki typów nie są używane do sprawdzania typu w czasie wykonywania. Nie są też wykorzystywane do optymalizacji. Należy również pamiętać, że wskazówki typów są w powijakach. Prawie żaden kod w Pythonie nie ma podpowiedzi typu i nie opracowano narzędzi analitycznych, aby sobie z nimi poradzić (o ile wiem). –

+0

Z sekcji [Non-Goals] (https://www.python.org/dev/peps/pep-0484/#non-goals) PEP484: "Podczas gdy proponowany moduł do pisania będzie zawierał bloki konstrukcyjne dla typu uruchomieniowego sprawdzanie - w szczególności funkcja get_type_hints() - należałoby opracować pakiety stron trzecich, aby zaimplementować określoną funkcję sprawdzania typu środowiska wykonawczego, na przykład za pomocą dekoratorów lub metaclasses, a wskazówki dotyczące typów dla optymalizacji wydajności pozostawia się jako ćwiczenie dla czytelnika. " –

0

Co powiesz na coś takiego, jak row = lambda datum: list(datum)? Nie ma tam wsparcia introspekcji typu rzeczywistego, ale jest to bardzo prosty sposób na typy "aliasingowe", zważywszy na zamiłowanie Pythona do pisania na klawiaturze. I jest funkcjonalny! Kinda.

+0

Jeśli naprawdę chcesz robić takie rzeczy, po prostu użyj 'row = list'. Nie ma potrzeby komplikować rzeczy. – Kevin

+0

@Kevin To działa dla 'row', tak, ale nie dla' table' lub 'database'. – JAB

+0

Naprawdę? Jaki jest podpis 'table()'? Jak to w ogóle różni się od 'list()'? – Kevin