27
HANDLE ERROR, GENERATOR AND DECORATOR John Saturday, June 18, 2022

Python advanced 1.handle error, generator, decorator and decriptor

Embed Size (px)

Citation preview

Page 1: Python advanced 1.handle error, generator, decorator and decriptor

HANDLE ERROR, GENERATOR AND

DECORATORJohnThursday, April 13, 2023

Page 2: Python advanced 1.handle error, generator, decorator and decriptor

HANDLE ANY UNEXPECTED ERROR

Page 3: Python advanced 1.handle error, generator, decorator and decriptor

Brief introduction

• Python provide 2 ways to handle unexpected error: exception and assert.

• Exception handling: is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions.

• The exceptions are defined in the built-in class exceptions

• For example: If divided by 0, we want to raise an exception

Page 4: Python advanced 1.handle error, generator, decorator and decriptor

Built-in exceptions

Page 5: Python advanced 1.handle error, generator, decorator and decriptor

Warnings

• It is defined on the warnings module

Page 6: Python advanced 1.handle error, generator, decorator and decriptor

Raising Exceptions

• The raise statement allows the programmer to force a specified exception to occur

raise NameError('HiThere')

• Raise statement is to raise an exceptions, try-exception-finally clause is to catch an exceptions and decide how to do.

Page 7: Python advanced 1.handle error, generator, decorator and decriptor

Try …except…finally structure

• First, the try clause(print 100/0) is executed• If no exception occurs, the except clause is skipped • Otherwise, the rest of the try clause is skipped. Go to the line its type

matches the exception name(ZeroDivisionError).• Clean-up info in the finally sentence. It executed under all conditions

Page 8: Python advanced 1.handle error, generator, decorator and decriptor

Write User-defined Exceptions>>> class MyError(Exception):... def __init__(self, value):... self.value = value... def __str__(self):... return repr(self.value)

• Define user-defined exception MyError. • Raise an exception when x == 0. Also write the try-except-finally

clause• When call f(0,100), the exception is raised and catched.

Page 9: Python advanced 1.handle error, generator, decorator and decriptor

Brief introduction of assert

• The assert clause is used on situation or condition that should never happen. For example: assert 1>0

• “assert” statement is removed when the compilation is optimized (-O and -OO option, it is because __debug__ change to False when -O or -OO option are added).

• So It is a convenient way to insert debugging assertion into a program

Page 10: Python advanced 1.handle error, generator, decorator and decriptor

Quick example

• We can see assert is ignored when add -O option

Page 11: Python advanced 1.handle error, generator, decorator and decriptor

GENERATOR

Page 12: Python advanced 1.handle error, generator, decorator and decriptor

Brief introduction

• Generator s are a simple and powerful tool for create iterators.

• Use yield statement instead of return to return data

• the __iter__() and next() methods are created automatically. The local and execution state are saved automatically.

• When generator terminate, it raise StopIteration

Page 13: Python advanced 1.handle error, generator, decorator and decriptor

Quick example

• When you call the generator function, the co de does not run. It just return the generator object.

Page 14: Python advanced 1.handle error, generator, decorator and decriptor

The difference between generator and sequence type>>> mylist = [x*x for x in range(3)]>>> mygenerator = (x*x for x in range(3))•Both mylist and mygenerator are iterable•But you can only read generator once. •Generator do not store all the values in memory, they generate the values on the fly.

Page 15: Python advanced 1.handle error, generator, decorator and decriptor

DECORATOR

Page 16: Python advanced 1.handle error, generator, decorator and decriptor

Brief introduction

• Functions are objects in python.• We can define other function inside function

definition.• We can pass a function as argument of other

function.

Page 17: Python advanced 1.handle error, generator, decorator and decriptor

Quick example• benchmark function accept

func as input argument.• We can see @benchmark

equal to apply benchmark function on f

f = benchmark(f)

• This is the typical usage of decorator: Use func as input argument. define wrapper function inside function definition

Page 18: Python advanced 1.handle error, generator, decorator and decriptor

Official document

• PEP - 318 Decorators for Functions and Methods

Page 19: Python advanced 1.handle error, generator, decorator and decriptor

DESCRIPTOR

Page 20: Python advanced 1.handle error, generator, decorator and decriptor

Brief introduction

• A descriptor is an object attribute with “binding behavior”.

• If any of __get__(), __set__() and __delete__() are defined for an object, it is said to be a descriptor.

Page 21: Python advanced 1.handle error, generator, decorator and decriptor

Descriptor protocol • If an object defines both __get__() and __set__(), it is considered a

data descriptor. • Descriptors that only define __get__() are called non-data

descriptors

• descriptors are invoked by the __getattribute__() method• overriding __getattribute__() prevents automatic descriptor

calls

Page 22: Python advanced 1.handle error, generator, decorator and decriptor

Descriptor example

• Define __set__ and __get__ method.

Page 23: Python advanced 1.handle error, generator, decorator and decriptor

Implement the property() method

• Calling property() is a succinct way of building a data descriptor

Page 24: Python advanced 1.handle error, generator, decorator and decriptor

Let us write the similar property() descriptor

Page 25: Python advanced 1.handle error, generator, decorator and decriptor

Function are non-data descriptor

• All functions include __get__() method for binding methods.

Page 26: Python advanced 1.handle error, generator, decorator and decriptor

Non-data descriptor staticmethod

• The pure python verson of static method should be like:

Use static method

Page 27: Python advanced 1.handle error, generator, decorator and decriptor

Non-data descriptor classmethod

• Pure python version of classmethod looks like: