From e1d32260568be80f1b060729dfcbd73f9b77c6f8 Mon Sep 17 00:00:00 2001 From: Eden Kirin Date: Thu, 16 Feb 2023 11:09:23 +0100 Subject: [PATCH] Examples --- .gitignore | 2 ++ generics_1.py | 35 +++++++++++++++++++++++++++++++++++ generics_1_lib.py | 0 generics_2.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ generics_func.py | 33 +++++++++++++++++++++++++++++++++ lib/__init__.py | 0 lib/gen_1.py | 37 +++++++++++++++++++++++++++++++++++++ lib/gen_2.py | 40 ++++++++++++++++++++++++++++++++++++++++ requirements.txt | 1 + 9 files changed, 195 insertions(+) create mode 100644 .gitignore create mode 100644 generics_1.py create mode 100644 generics_1_lib.py create mode 100644 generics_2.py create mode 100644 generics_func.py create mode 100644 lib/__init__.py create mode 100644 lib/gen_1.py create mode 100644 lib/gen_2.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ae873f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.vscode +__pycache__ diff --git a/generics_1.py b/generics_1.py new file mode 100644 index 0000000..2b93f1f --- /dev/null +++ b/generics_1.py @@ -0,0 +1,35 @@ +from lib.gen_1 import ( + Employee, + EmployeeContainer, + Partner, + PartnerContainer, +) + + +def main(): + employees = EmployeeContainer( + [ + Employee(id=1, first_name="Pero", last_name="Perić", department="Dev"), + Employee(id=2, first_name="Mirko", last_name="Mirković", department="Dev"), + Employee(id=3, first_name="Ivo", last_name="Ivić", department="Sales"), + ] + ) + + partners = PartnerContainer( + [ + Partner(id=101, first_name="Ante", last_name="Antić", company="CocaCola"), + Partner(id=102, first_name="Šime", last_name="Šimić", company="CocaCola"), + Partner(id=103, first_name="Mate", last_name="Matić", company="Pepsi"), + ] + ) + + user = employees.get_user_by_id(id=2) + print("Found user:", user) + + cocacola_partners = partners.get_by_company(company="CocaCola") + for partner in cocacola_partners: + print(partner) + + +if __name__ == "__main__": + main() diff --git a/generics_1_lib.py b/generics_1_lib.py new file mode 100644 index 0000000..e69de29 diff --git a/generics_2.py b/generics_2.py new file mode 100644 index 0000000..42b742a --- /dev/null +++ b/generics_2.py @@ -0,0 +1,47 @@ +from lib.gen_2 import ( + Employee, + EmployeeContainer, + Partner, + PartnerContainer, + UserContainer, +) + + +def main(): + users = UserContainer[Employee]( + [ + Employee(id=1, first_name="Pero", last_name="Perić", department="Dev"), + Employee(id=2, first_name="Mirko", last_name="Mirković", department="Dev"), + Employee(id=3, first_name="Ivo", last_name="Ivić", department="Sales"), + ] + ) + users[0] + + employees = EmployeeContainer( + [ + Employee(id=1, first_name="Pero", last_name="Perić", department="Dev"), + Employee(id=2, first_name="Mirko", last_name="Mirković", department="Dev"), + Employee(id=3, first_name="Ivo", last_name="Ivić", department="Sales"), + ] + ) + employees[0] + + partners = PartnerContainer( + [ + Partner(id=101, first_name="Ante", last_name="Antić", company="CocaCola"), + Partner(id=102, first_name="Šime", last_name="Šimić", company="CocaCola"), + Partner(id=103, first_name="Mate", last_name="Matić", company="Pepsi"), + ] + ) + partners[0] + + employee = employees.get_user_by_id(id=2) + print("Found user:", employee) + + cocacola_partners = partners.get_by_company(company="CocaCola") + for partner in cocacola_partners: + print(partner) + + +if __name__ == "__main__": + main() diff --git a/generics_func.py b/generics_func.py new file mode 100644 index 0000000..4914dc2 --- /dev/null +++ b/generics_func.py @@ -0,0 +1,33 @@ +from typing import Dict, TypeVar + + +K = TypeVar("K") +V = TypeVar("V") + + +def get_item(values: Dict[K, V], key: K) -> V: + return values[key] + + +def main(): + str_keys: Dict[str, int] = { + "prvi": 1, + "drugi": 2, + "treći": 3, + } + + a = get_item(str_keys, "drugi") + print(a) + + int_keys: Dict[int, str] = { + 1: "prvi", + 2: "drugi", + 3: "treći", + } + + a = get_item(int_keys, 3) + print(a) + + +if __name__ == "__main__": + main() diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/gen_1.py b/lib/gen_1.py new file mode 100644 index 0000000..9e18ff8 --- /dev/null +++ b/lib/gen_1.py @@ -0,0 +1,37 @@ +from dataclasses import dataclass +from typing import List, Optional + + +@dataclass +class UserBase: + id: int + first_name: str + last_name: str + + +@dataclass +class Employee(UserBase): + department: str + + +@dataclass +class Partner(UserBase): + company: str + + +class UserContainer(list): + def get_user_by_id(self, id: int) -> Optional[UserBase]: + for user in self: + if user.id == id: + return user + return None + + +class EmployeeContainer(UserContainer): + def get_by_department(self, department: str) -> List[Employee]: + return [user for user in self if user.department == department] + + +class PartnerContainer(UserContainer): + def get_by_company(self, company: str) -> List[Partner]: + return [user for user in self if user.company == company] diff --git a/lib/gen_2.py b/lib/gen_2.py new file mode 100644 index 0000000..d99e701 --- /dev/null +++ b/lib/gen_2.py @@ -0,0 +1,40 @@ +from dataclasses import dataclass +from typing import Generic, List, Optional, TypeVar + + +@dataclass +class UserBase: + id: int + first_name: str + last_name: str + + +@dataclass +class Employee(UserBase): + department: str + + +@dataclass +class Partner(UserBase): + company: str + + +UserContainerType = TypeVar("UserContainerType", bound=UserBase) + + +class UserContainer(List[UserContainerType]): + def get_user_by_id(self, id: int) -> Optional[UserContainerType]: + for user in self: + if user.id == id: + return user + return None + + +class EmployeeContainer(UserContainer[Employee]): + def get_by_department(self, department: str) -> List[Employee]: + return [user for user in self if user.department == department] + + +class PartnerContainer(UserContainer[Partner]): + def get_by_company(self, company: str) -> List[Partner]: + return [user for user in self if user.company == company] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..572b352 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pydantic