# python/01-basic-type-hints.py"""Basic type hints and fundamental typing patterns"""fromtypingimportList,Dict,Any,Optional,Union,Tuple,Set,Callable,TypefromdataclassesimportdataclassfromenumimportEnumimportasynciofrompathlibimportPath# Basic typesdefbasic_types_example()->None:"""Example of basic type hints"""# Primitive typesname:str="John Doe"age:int=30height:float=5.9is_active:bool=True# Collectionsnumbers:List[int]=[1,2,3,4,5]scores:Dict[str,float]={"math":95.5,"science":87.0}coordinates:Tuple[float,float]=(40.7128,-74.0060)unique_ids:Set[str]={"user1","user2","user3"}# Optional typesoptional_name:Optional[str]=Noneoptional_age:Optional[int]=25# Union typesid_value:Union[int,str]="user123"status:Union[str,int]="active"print(f"Name: {name}, Age: {age}, Height: {height}")print(f"Numbers: {numbers}, Scores: {scores}")# Function type hintsdefcalculate_average(numbers:List[float])->float:"""Calculate average of numbers"""ifnotnumbers:return0.0returnsum(numbers)/len(numbers)defprocess_user_data(user_id:int,name:str,email:Optional[str]=None)->Dict[str,Any]:"""Process user data with type hints"""return{"id":user_id,"name":name,"email":email,"is_verified":emailisnotNone}# Class type hints@dataclassclassUser:"""User class with type hints"""id:intname:stremail:Optional[str]=Noneage:Optional[int]=Noneis_active:bool=Truedefget_display_name(self)->str:"""Get user display name"""returnf"{self.name} ({self.email})"ifself.emailelseself.namedefis_adult(self)->bool:"""Check if user is adult"""returnself.ageisnotNoneandself.age>=18# Enum with type hintsclassUserRole(Enum):"""User role enumeration"""ADMIN="admin"USER="user"GUEST="guest"@dataclassclassUserWithRole(User):"""User with role information"""role:UserRole=UserRole.USERdefhas_permission(self,required_role:UserRole)->bool:"""Check if user has required permission"""role_hierarchy={UserRole.GUEST:0,UserRole.USER:1,UserRole.ADMIN:2}returnrole_hierarchy.get(self.role,0)>=role_hierarchy.get(required_role,0)# Usage examplesdefexample_basic_usage():"""Example basic type hints usage"""# Basic typesbasic_types_example()# Function with type hintsnumbers=[1.5,2.5,3.5,4.5]average=calculate_average(numbers)print(f"Average: {average}")# Class with type hintsuser=User(id=1,name="John Doe",email="john@example.com",age=30)print(f"User: {user.get_display_name()}")print(f"Is adult: {user.is_adult()}")# User with roleadmin_user=UserWithRole(id=2,name="Admin User",email="admin@example.com",age=35,role=UserRole.ADMIN)print(f"Admin has user permission: {admin_user.has_permission(UserRole.USER)}")
# python/02-advanced-type-hints.py"""Advanced type hints including generics, protocols, and complex types"""fromtypingimportList,Dict,Any,Optional,Union,Tuple,Set,Callable,Type,TypeVar,Generic,Protocol,runtime_checkablefromabcimportABC,abstractmethodimportasynciofromdataclassesimportdataclassfromenumimportEnum# Generic typesT=TypeVar('T')K=TypeVar('K')V=TypeVar('V')classGenericContainer(Generic[T]):"""Generic container class"""def__init__(self,items:List[T])->None:self.items=itemsdefadd(self,item:T)->None:"""Add item to container"""self.items.append(item)defget(self,index:int)->Optional[T]:"""Get item by index"""if0<=index<len(self.items):returnself.items[index]returnNonedefget_all(self)->List[T]:"""Get all items"""returnself.items.copy()deffilter(self,predicate:Callable[[T],bool])->List[T]:"""Filter items by predicate"""return[itemforiteminself.itemsifpredicate(item)]# Protocol for type checking@runtime_checkableclassDrawable(Protocol):"""Protocol for drawable objects"""defdraw(self)->str:"""Draw the object"""...defget_area(self)->float:"""Get area of the object"""...classCircle:"""Circle class implementing Drawable protocol"""def__init__(self,radius:float)->None:self.radius=radiusdefdraw(self)->str:"""Draw circle"""returnf"Drawing circle with radius {self.radius}"defget_area(self)->float:"""Get circle area"""return3.14159*self.radius**2classRectangle:"""Rectangle class implementing Drawable protocol"""def__init__(self,width:float,height:float)->None:self.width=widthself.height=heightdefdraw(self)->str:"""Draw rectangle"""returnf"Drawing rectangle {self.width}x{self.height}"defget_area(self)->float:"""Get rectangle area"""returnself.width*self.height# Complex type hintsdefprocess_drawable_objects(objects:List[Drawable])->Tuple[List[str],float]:"""Process list of drawable objects"""drawings=[obj.draw()forobjinobjects]total_area=sum(obj.get_area()forobjinobjects)returndrawings,total_area# Callable type hintsdefcreate_multiplier(factor:int)->Callable[[int],int]:"""Create multiplier function"""defmultiply(x:int)->int:returnx*factorreturnmultiplydefapply_function(func:Callable[[T],V],items:List[T])->List[V]:"""Apply function to list of items"""return[func(item)foriteminitems]# Async type hintsasyncdefasync_processor(items:List[T],processor:Callable[[T],Any])->List[Any]:"""Async processor with type hints"""tasks=[processor(item)foriteminitems]returnawaitasyncio.gather(*tasks)# Type aliasesUserId=intUserName=strUserEmail=strUserData=Dict[str,Any]defcreate_user(user_id:UserId,name:UserName,email:UserEmail)->UserData:"""Create user with type aliases"""return{"id":user_id,"name":name,"email":email}# Complex generic typesclassRepository(Generic[T]):"""Generic repository pattern"""def__init__(self)->None:self.items:Dict[int,T]={}self.next_id=1defadd(self,item:T)->int:"""Add item and return ID"""item_id=self.next_idself.items[item_id]=itemself.next_id+=1returnitem_iddefget(self,item_id:int)->Optional[T]:"""Get item by ID"""returnself.items.get(item_id)defget_all(self)->List[T]:"""Get all items"""returnlist(self.items.values())defupdate(self,item_id:int,item:T)->bool:"""Update item"""ifitem_idinself.items:self.items[item_id]=itemreturnTruereturnFalsedefdelete(self,item_id:int)->bool:"""Delete item"""ifitem_idinself.items:delself.items[item_id]returnTruereturnFalse# Usage examplesdefexample_advanced_usage():"""Example advanced type hints usage"""# Generic containerint_container=GenericContainer([1,2,3,4,5])int_container.add(6)print(f"Int container: {int_container.get_all()}")str_container=GenericContainer(["hello","world"])str_container.add("python")print(f"String container: {str_container.get_all()}")# Protocol usagecircle=Circle(5.0)rectangle=Rectangle(4.0,6.0)drawings,total_area=process_drawable_objects([circle,rectangle])print(f"Drawings: {drawings}")print(f"Total area: {total_area}")# Callable usagedouble=create_multiplier(2)triple=create_multiplier(3)numbers=[1,2,3,4,5]doubled=apply_function(double,numbers)tripled=apply_function(triple,numbers)print(f"Doubled: {doubled}")print(f"Tripled: {tripled}")# Repository usageuser_repo=Repository[User]()user1=User(id=1,name="John",email="john@example.com")user2=User(id=2,name="Jane",email="jane@example.com")id1=user_repo.add(user1)id2=user_repo.add(user2)print(f"Added users with IDs: {id1}, {id2}")print(f"All users: {user_repo.get_all()}")
# python/03-type-checking.py"""Runtime type checking and validation patterns"""fromtypingimportList,Dict,Any,Optional,Union,Type,get_type_hints,get_origin,get_argsimportinspectimportfunctoolsfromdataclassesimportdataclassfromenumimportEnumclassTypeChecker:"""Runtime type checker"""@staticmethoddefcheck_type(value:Any,expected_type:Type)->bool:"""Check if value matches expected type"""ifexpected_typeisAny:returnTrue# Handle Union typesifget_origin(expected_type)isUnion:returnany(TypeChecker.check_type(value,arg)forarginget_args(expected_type))# Handle Optional typesifexpected_typeisOptionalor(get_origin(expected_type)isUnionandtype(None)inget_args(expected_type)):ifvalueisNone:returnTrue# Check non-None typenon_none_types=[argforarginget_args(expected_type)ifargisnottype(None)]returnany(TypeChecker.check_type(value,arg)forarginnon_none_types)# Handle List typesifget_origin(expected_type)islist:ifnotisinstance(value,list):returnFalseelement_type=get_args(expected_type)[0]returnall(TypeChecker.check_type(item,element_type)foriteminvalue)# Handle Dict typesifget_origin(expected_type)isdict:ifnotisinstance(value,dict):returnFalsekey_type,value_type=get_args(expected_type)returnall(TypeChecker.check_type(k,key_type)andTypeChecker.check_type(v,value_type)fork,vinvalue.items())# Handle Tuple typesifget_origin(expected_type)istuple:ifnotisinstance(value,tuple):returnFalseelement_types=get_args(expected_type)iflen(value)!=len(element_types):returnFalsereturnall(TypeChecker.check_type(v,t)forv,tinzip(value,element_types))# Handle Set typesifget_origin(expected_type)isset:ifnotisinstance(value,set):returnFalseelement_type=get_args(expected_type)[0]returnall(TypeChecker.check_type(item,element_type)foriteminvalue)# Handle Callable typesifget_origin(expected_type)iscallable:returncallable(value)# Handle basic typesreturnisinstance(value,expected_type)@staticmethoddefvalidate_function_args(func:Callable,args:tuple,kwargs:dict)->bool:"""Validate function arguments against type hints"""try:hints=get_type_hints(func)sig=inspect.signature(func)bound=sig.bind(*args,**kwargs)bound.apply_defaults()forparam_name,param_valueinbound.arguments.items():ifparam_nameinhints:expected_type=hints[param_name]ifnotTypeChecker.check_type(param_value,expected_type):returnFalsereturnTrueexceptException:returnFalsedeftype_check(func:Callable)->Callable:"""Decorator for runtime type checking"""@functools.wraps(func)defwrapper(*args,**kwargs):ifnotTypeChecker.validate_function_args(func,args,kwargs):raiseTypeError(f"Type validation failed for {func.__name__}")returnfunc(*args,**kwargs)returnwrapperclassTypeValidator:"""Type validator for data validation"""def__init__(self):self.validators:Dict[str,Type]={}defregister_validator(self,field_name:str,field_type:Type)->None:"""Register validator for field"""self.validators[field_name]=field_typedefvalidate(self,data:Dict[str,Any])->Dict[str,Any]:"""Validate data against registered validators"""validated_data={}errors={}forfield_name,field_typeinself.validators.items():iffield_nameindata:value=data[field_name]ifTypeChecker.check_type(value,field_type):validated_data[field_name]=valueelse:errors[field_name]=f"Expected {field_type}, got {type(value)}"else:errors[field_name]=f"Missing required field: {field_name}"iferrors:raiseValueError(f"Validation errors: {errors}")returnvalidated_data# Usage examples@type_checkdefprocess_numbers(numbers:List[int])->int:"""Process list of numbers with type checking"""returnsum(numbers)@type_checkdefcreate_user_profile(name:str,age:int,email:Optional[str]=None)->Dict[str,Any]:"""Create user profile with type checking"""return{"name":name,"age":age,"email":email,"is_verified":emailisnotNone}defexample_type_checking():"""Example type checking usage"""# Type checking decoratortry:result=process_numbers([1,2,3,4,5])print(f"Sum: {result}")exceptTypeErrorase:print(f"Type error: {e}")# Type validatorvalidator=TypeValidator()validator.register_validator("name",str)validator.register_validator("age",int)validator.register_validator("email",Optional[str])try:data={"name":"John","age":30,"email":"john@example.com"}validated=validator.validate(data)print(f"Validated data: {validated}")exceptValueErrorase:print(f"Validation error: {e}")
# 1. Basic type hintsdefprocess_data(data:List[str])->Dict[str,int]:return{item:len(item)foritemindata}# 2. Generic typesT=TypeVar('T')classContainer(Generic[T]):def__init__(self,items:List[T])->None:self.items=items# 3. Type checking decorator@type_checkdefvalidate_input(value:int)->str:returnstr(value)# 4. Protocol for type safetyclassDrawable(Protocol):defdraw(self)->str:...# 5. Type-safe patternsclassRepository(Generic[T]):defadd(self,item:T)->int:...defget(self,item_id:int)->Optional[T]:...
# Complete type hints setupdefsetup_type_hints():"""Setup complete type hints environment"""# Type checkertype_checker=TypeChecker()# Type validatorvalidator=TypeValidator()# Type analyzeranalyzer=TypeAnalyzer(Path("."))analyzer.setup_mypy_config()# Type documentationdoc_generator=TypeDocumentation()print("Type hints setup complete!")