This commit is contained in:
Eden Kirin
2023-02-16 11:09:23 +01:00
commit e1d3226056
9 changed files with 195 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/.vscode
__pycache__

35
generics_1.py Normal file
View File

@ -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()

0
generics_1_lib.py Normal file
View File

47
generics_2.py Normal file
View File

@ -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()

33
generics_func.py Normal file
View File

@ -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()

0
lib/__init__.py Normal file
View File

37
lib/gen_1.py Normal file
View File

@ -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]

40
lib/gen_2.py Normal file
View File

@ -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]

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
pydantic