Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sygnatury typów w funkcjach i metodach #7

Open
pawelkisielewicz opened this issue Jun 8, 2018 · 10 comments
Open

Sygnatury typów w funkcjach i metodach #7

pawelkisielewicz opened this issue Jun 8, 2018 · 10 comments

Comments

@pawelkisielewicz
Copy link

pawelkisielewicz commented Jun 8, 2018

Często korzystamy w sygnaturach funkcji i metod z określenia typów pól, które mają być do niej przekazywane, np.

def foo(key : bytes, deadline: int):

natomiast rzadko piszemy, jaki typ jest zwracany. Moim zdaniem dobrze byłoby deklarować również typ wartości zwracanej, np.

def foo(key : bytes, deadline: int) -> str:

@cameel
Copy link
Member

cameel commented Jun 8, 2018

Zgadzam się, zwracany typ powinien być zawsze deklarowany.

@Jakub89
Copy link

Jakub89 commented Jun 8, 2018

👍

@rwrzesien
Copy link

👍 A co jeżeli jest None ?

@cameel
Copy link
Member

cameel commented Jun 11, 2018

A co jeżeli jest None ?

def foo(key : bytes, deadline: int) -> None:

To, że funkcja ma w założeniach nigdy nie zwracać nic interesującego to też przydatna informacja, którą checker może zweryfikować.

@dybi
Copy link

dybi commented Jun 12, 2018

Ja uważam, że w procedurach (por. #6 (comment)), nie powinniśmy deklarować zwracanego typu (w sensie, skoro ta funkcja z założenia ma nic nie zwracać, nie powinniśmy deklarować, że zwraca).

Co do funkcji właściwych - zawsze powinniśmy deklarować typ zwracanej przez nie wartości. Warto (ba, należy!) używać, np.:

  • Optional[SomeType], kiedy fukcja zwraca SomeType albo None

  • Union[SomeType, SomeOtherType], kiedy funkcja zwraca SomeType lub SomeOtherType

  • aliasów, kiedy zdeklarowny typ robi się skomplikowany, np.

def foo() -> List[Dict[Text, Dict[any, any]]:
   # some code

lepiej jest:

UserInfoList = List[Dict[Text, Dict[any, any]]]

def foo() -> UserInfoList:
   # some code

@rwrzesien
Copy link

rwrzesien commented Jun 12, 2018

To, że funkcja ma w założeniach nigdy nie zwracać nic interesującego to też przydatna informacja, którą checker może zweryfikować.

👍 pytałem pod kątem jak to ustalamy. Ale zgadzam się też z @dybi że jeżeli ma nic nie zwracać to nie powinniśmy deklarować.

Natomiast aliasom jestem przeciwny, moim zdaniem powinniśmy w takiej sytuacji lepiej przeformatować sygnaturę funkcji (podzielić na więcej linii itp.)

@dybi
Copy link

dybi commented Jun 12, 2018

Natomiast aliasom jestem przeciwny, moim zdaniem powinniśmy w takiej sytuacji lepiej przeformatować sygnaturę funkcji (podzielić na więcej linii itp.)

Jeśli chodzi o argumenty, to jak najbardziej można rozbić sygnaturę, ale nie bardzo wyobrażam sobie rozbijanie na kilka lini (skomplikowanej) wartości zwracanej przez funkcję... Zerknijcie na https://mypy.readthedocs.io/en/latest/kinds_of_types.html#type-aliases

@cameel
Copy link
Member

cameel commented Jun 13, 2018

Ja jestem za aliasami jeżeli typ jest bardzo skomplikowany. Dodatkową zaletą jest to, że od razu widać, że dwie funkcje zwracają to samo - bez aliasu trzeba w całości przeanalizować skomplikowaną definicję zwracanego typu. Ponadto te typy się tak łatwo nie rozsynchronizują.

No ale też nie nadużywałbym ich. Jeżeli typ jest krótki to lepiej podać go eksplicite. Żeby nie trzeba było szukać go np. w innym pliku.

Jeżeli chodzi o procedury to ja bym mimo wszystko był za deklarowaniem typu. Jeżeli nie zadeklarujesz, że twoim celem jest zdefiniowanie procedury to mypy nie bedzie w stanie tego sprawdzić. Przy czym nie będę się przy tym bardzo mocno upierał bo zysk z tego jest marginalny. Ale mimo wszystko jakiś jest.

@dybi
Copy link

dybi commented Jun 14, 2018

@cameel, to ja jeszcze sobie doczytam o mypy i poszukam w necie najlepszych praktyk odnośnie procedur ;) Odezwę się jak znajdę coś ciekawego.

@pawelkisielewicz
Copy link
Author

Jakie jest nasze stanowisko dotyczące deklaracji typów w testach? Chodzi zarówno o funkcje testowe (np. test_that...) jak również metody utilsowe wykorzystywane tylko w testach.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants