Best Python code snippet using playwright-python
field_metadata.py
Source:field_metadata.py  
1'''2Created on 25 May 20103@author: charles4'''5import copy, traceback6from collections import OrderedDict7from calibre.utils.config_base import tweaks8class TagsIcons(dict):9    '''10    If the client wants icons to be in the tag structure, this class must be11    instantiated and filled in with real icons. If this class is instantiated12    and passed to get_categories, All items must be given a value not None13    '''14    category_icons = ['authors', 'series', 'formats', 'publisher', 'rating',15                      'news',    'tags',   'custom:', 'user:',     'search',16                      'identifiers', 'languages', 'gst']17    def __init__(self, icon_dict):18        for a in self.category_icons:19            if a not in icon_dict:20                raise ValueError('Missing category icon [%s]'%a)21            self[a] = icon_dict[a]22category_icon_map = {23                    'authors'    : 'user_profile.png',24                    'series'     : 'series.png',25                    'formats'    : 'book.png',26                    'publisher'  : 'publisher.png',27                    'rating'     : 'rating.png',28                    'news'       : 'news.png',29                    'tags'       : 'tags.png',30                    'custom:'    : 'column.png',31                    'user:'      : 'tb_folder.png',32                    'search'     : 'search.png',33                    'identifiers': 'identifiers.png',34                    'gst'        : 'catalog.png',35                    'languages'  : 'languages.png',36            }37class FieldMetadata(dict):38    '''39    key: the key to the dictionary is:40    - for standard fields, the metadata field name.41    - for custom fields, the metadata field name prefixed by '#'42    This is done to create two 'namespaces' so the names don't clash43    label: the actual column label. No prefixing.44    datatype: the type of information in the field. Valid values are listed in45    VALID_DATA_TYPES below.46    is_multiple: valid for the text datatype. If {}, the field is to be47    treated as a single term. If not None, it contains a dict of the form48            {'cache_to_list': ',',49             'ui_to_list': ',',50             'list_to_ui': ', '}51    where the cache_to_list contains the character used to split the value in52    the meta2 table, ui_to_list contains the character used to create a list53    from a value shown in the ui (each resulting value must be strip()ed and54    empty values removed), and list_to_ui contains the string used in join()55    to create a displayable string from the list.56    kind == field: is a db field.57    kind == category: standard tag category that isn't a field. see news.58    kind == user: user-defined tag category.59    kind == search: saved-searches category.60    is_category: is a tag browser category. If true, then:61       table: name of the db table used to construct item list62       column: name of the column in the normalized table to join on63       link_column: name of the column in the connection table to join on. This64                    key should not be present if there is no link table65       category_sort: the field in the normalized table to sort on. This66                      key must be present if is_category is True67       If these are None, then the category constructor must know how68       to build the item list (e.g., formats, news).69       The order below is the order that the categories will70       appear in the tags pane.71    name: the text that is to be used when displaying the field. Column headings72    in the GUI, etc.73    search_terms: the terms that can be used to identify the field when74    searching. They can be thought of as aliases for metadata keys, but are only75    valid when passed to search().76    is_custom: the field has been added by the user.77    rec_index: the index of the field in the db metadata record.78    is_csp: field contains colon-separated pairs. Must also be text, is_multiple79    '''80    VALID_DATA_TYPES = frozenset([None, 'rating', 'text', 'comments', 'datetime',81                'int', 'float', 'bool', 'series', 'composite', 'enumeration'])82    # Builtin metadata {{{83    _field_metadata_prototype = [84            ('authors',   {'table':'authors',85                           'column':'name',86                           'link_column':'author',87                           'category_sort':'sort',88                           'datatype':'text',89                           'is_multiple':{'cache_to_list': ',',90                                          'ui_to_list': '&',91                                          'list_to_ui': ' & '},92                           'kind':'field',93                           'name':_('Authors'),94                           'search_terms':['authors', 'author'],95                           'is_custom':False,96                           'is_category':True,97                           'is_csp': False}),98            ('languages', {'table':'languages',99                           'column':'lang_code',100                           'link_column':'lang_code',101                           'category_sort':'lang_code',102                           'datatype':'text',103                           'is_multiple':{'cache_to_list': ',',104                                          'ui_to_list': ',',105                                          'list_to_ui': ', '},106                           'kind':'field',107                           'name':_('Languages'),108                           'search_terms':['languages', 'language'],109                           'is_custom':False,110                           'is_category':True,111                           'is_csp': False}),112            ('series',    {'table':'series',113                           'column':'name',114                           'link_column':'series',115                           'category_sort':'(title_sort(name))',116                           'datatype':'series',117                           'is_multiple':{},118                           'kind':'field',119                           'name':'Series',120                           'search_terms':['series'],121                           'is_custom':False,122                           'is_category':True,123                           'is_csp': False}),124            ('formats',   {'table':None,125                           'column':None,126                           'datatype':'text',127                           'is_multiple':{'cache_to_list': ',',128                                          'ui_to_list': ',',129                                          'list_to_ui': ', '},130                           'kind':'field',131                           'name':_('Formats'),132                           'search_terms':['formats', 'format'],133                           'is_custom':False,134                           'is_category':True,135                           'is_csp': False}),136            ('publisher', {'table':'publishers',137                           'column':'name',138                           'link_column':'publisher',139                           'category_sort':'name',140                           'datatype':'text',141                           'is_multiple':{},142                           'kind':'field',143                           'name':_('Publishers'),144                           'search_terms':['publisher'],145                           'is_custom':False,146                           'is_category':True,147                           'is_csp': False}),148            ('rating',    {'table':'ratings',149                           'column':'rating',150                           'link_column':'rating',151                           'category_sort':'rating',152                           'datatype':'rating',153                           'is_multiple':{},154                           'kind':'field',155                           'name':_('Rating'),156                           'search_terms':['rating'],157                           'is_custom':False,158                           'is_category':True,159                           'is_csp': False}),160            ('news',      {'table':'news',161                           'column':'name',162                           'category_sort':'name',163                           'datatype':None,164                           'is_multiple':{},165                           'kind':'category',166                           'name':_('News'),167                           'search_terms':[],168                           'is_custom':False,169                           'is_category':True,170                           'is_csp': False}),171            ('tags',      {'table':'tags',172                           'column':'name',173                           'link_column': 'tag',174                           'category_sort':'name',175                           'datatype':'text',176                           'is_multiple':{'cache_to_list': ',',177                                          'ui_to_list': ',',178                                          'list_to_ui': ', '},179                           'kind':'field',180                           'name':_('Tags'),181                           'search_terms':['tags', 'tag'],182                           'is_custom':False,183                           'is_category':True,184                           'is_csp': False}),185            ('identifiers',   {'table':None,186                           'column':None,187                           'datatype':'text',188                           'is_multiple':{'cache_to_list': ',',189                                          'ui_to_list': ',',190                                          'list_to_ui': ', '},191                           'kind':'field',192                           'name':_('Identifiers'),193                           'search_terms':['identifiers', 'identifier', 'isbn'],194                           'is_custom':False,195                           'is_category':True,196                           'is_csp': True}),197            ('author_sort',{'table':None,198                            'column':None,199                            'datatype':'text',200                           'is_multiple':{},201                           'kind':'field',202                           'name':_('Author Sort'),203                           'search_terms':['author_sort'],204                           'is_custom':False,205                           'is_category':False,206                           'is_csp': False}),207            ('au_map',    {'table':None,208                           'column':None,209                           'datatype':'text',210                           'is_multiple':{'cache_to_list': ',',211                                          'ui_to_list': None,212                                          'list_to_ui': None},213                           'kind':'field',214                           'name':None,215                           'search_terms':[],216                           'is_custom':False,217                           'is_category':False,218                           'is_csp': False}),219            ('comments',  {'table':None,220                           'column':None,221                           'datatype':'text',222                           'is_multiple':{},223                           'kind':'field',224                           'name':_('Comments'),225                           'search_terms':['comments', 'comment'],226                           'is_custom':False,227                           'is_category':False,228                           'is_csp': False}),229            ('cover',     {'table':None,230                           'column':None,231                           'datatype':'int',232                           'is_multiple':{},233                           'kind':'field',234                           'name':_('Cover'),235                           'search_terms':['cover'],236                           'is_custom':False,237                           'is_category':False,238                           'is_csp': False}),239            ('id',        {'table':None,240                           'column':None,241                           'datatype':'int',242                           'is_multiple':{},243                           'kind':'field',244                           'name':None,245                           'search_terms':[],246                           'is_custom':False,247                           'is_category':False,248                           'is_csp': False}),249            ('last_modified', {'table':None,250                           'column':None,251                           'datatype':'datetime',252                           'is_multiple':{},253                           'kind':'field',254                           'name':_('Modified'),255                           'search_terms':['last_modified'],256                           'is_custom':False,257                           'is_category':False,258                           'is_csp': False}),259            ('ondevice',  {'table':None,260                           'column':None,261                           'datatype':'text',262                           'is_multiple':{},263                           'kind':'field',264                           'name':_('On Device'),265                           'search_terms':['ondevice'],266                           'is_custom':False,267                           'is_category':False,268                           'is_csp': False}),269            ('path',      {'table':None,270                           'column':None,271                           'datatype':'text',272                           'is_multiple':{},273                           'kind':'field',274                           'name':_('Path'),275                           'search_terms':[],276                           'is_custom':False,277                           'is_category':False,278                           'is_csp': False}),279            ('pubdate',   {'table':None,280                           'column':None,281                           'datatype':'datetime',282                           'is_multiple':{},283                           'kind':'field',284                           'name':_('Published'),285                           'search_terms':['pubdate'],286                           'is_custom':False,287                           'is_category':False,288                           'is_csp': False}),289            ('marked',    {'table':None,290                           'column':None,291                           'datatype':'text',292                           'is_multiple':{},293                           'kind':'field',294                           'name': None,295                           'search_terms':['marked'],296                           'is_custom':False,297                           'is_category':False,298                           'is_csp': False}),299            ('series_index',{'table':None,300                             'column':None,301                             'datatype':'float',302                             'is_multiple':{},303                             'kind':'field',304                             'name':None,305                             'search_terms':['series_index'],306                             'is_custom':False,307                             'is_category':False,308                           'is_csp': False}),309            ('series_sort',  {'table':None,310                           'column':None,311                           'datatype':'text',312                           'is_multiple':{},313                           'kind':'field',314                           'name':_('Series Sort'),315                           'search_terms':['series_sort'],316                           'is_custom':False,317                           'is_category':False,318                           'is_csp': False}),319            ('sort',      {'table':None,320                           'column':None,321                           'datatype':'text',322                           'is_multiple':{},323                           'kind':'field',324                           'name':_('Title Sort'),325                           'search_terms':['title_sort'],326                           'is_custom':False,327                           'is_category':False,328                           'is_csp': False}),329            ('size',      {'table':None,330                           'column':None,331                           'datatype':'float',332                           'is_multiple':{},333                           'kind':'field',334                           'name':_('Size'),335                           'search_terms':['size'],336                           'is_custom':False,337                           'is_category':False,338                           'is_csp': False}),339            ('timestamp', {'table':None,340                           'column':None,341                           'datatype':'datetime',342                           'is_multiple':{},343                           'kind':'field',344                           'name':_('Date'),345                           'search_terms':['date'],346                           'is_custom':False,347                           'is_category':False,348                           'is_csp': False}),349            ('title',     {'table':None,350                           'column':None,351                           'datatype':'text',352                           'is_multiple':{},353                           'kind':'field',354                           'name':_('Title'),355                           'search_terms':['title'],356                           'is_custom':False,357                           'is_category':False,358                           'is_csp': False}),359            ('uuid',      {'table':None,360                           'column':None,361                           'datatype':'text',362                           'is_multiple':{},363                           'kind':'field',364                           'name':None,365                           'search_terms':[],366                           'is_custom':False,367                           'is_category':False,368                           'is_csp': False}),369        ]370    # }}}371    # search labels that are not db columns372    search_items = [    'all',373                        'search',374                    ]375    def __init__(self):376        self._field_metadata = copy.deepcopy(self._field_metadata_prototype)377        self._tb_cats = OrderedDict()378        self._tb_custom_fields = {}379        self._search_term_map = {}380        self.custom_label_to_key_map = {}381        for k,v in self._field_metadata:382            if v['kind'] == 'field' and v['datatype'] not in self.VALID_DATA_TYPES:383                raise ValueError('Unknown datatype %s for field %s'%(v['datatype'], k))384            self._tb_cats[k] = v385            self._tb_cats[k]['label'] = k386            self._tb_cats[k]['display'] = {}387            self._tb_cats[k]['is_editable'] = True388            self._add_search_terms_to_map(k, v['search_terms'])389        self._tb_cats['timestamp']['display'] = {390                        'date_format': tweaks['gui_timestamp_display_format']}391        self._tb_cats['pubdate']['display'] = {392                        'date_format': tweaks['gui_pubdate_display_format']}393        self._tb_cats['last_modified']['display'] = {394                        'date_format': tweaks['gui_last_modified_display_format']}395        self.custom_field_prefix = '#'396        self.get = self._tb_cats.get397    def __getitem__(self, key):398        if key == 'title_sort':399            return self._tb_cats['sort']400        return self._tb_cats[key]401    def __setitem__(self, key, val):402        raise AttributeError('Assigning to this object is forbidden')403    def __delitem__(self, key):404        del self._tb_cats[key]405    def __iter__(self):406        for key in self._tb_cats:407            yield key408    def __contains__(self, key):409        return self.has_key(key)410    def has_key(self, key):411        if key == 'title_sort':412            return True413        return key in self._tb_cats414    def keys(self):415        return self._tb_cats.keys()416    def sortable_field_keys(self):417        return [k for k in self._tb_cats.keys()418                if self._tb_cats[k]['kind']=='field' and419                   self._tb_cats[k]['datatype'] is not None]420    def displayable_field_keys(self):421        return [k for k in self._tb_cats.keys()422                if self._tb_cats[k]['kind']=='field' and423                   self._tb_cats[k]['datatype'] is not None and424                   k not in ('au_map', 'marked', 'ondevice', 'cover') and425                   not self.is_series_index(k)]426    def standard_field_keys(self):427        return [k for k in self._tb_cats.keys()428                if self._tb_cats[k]['kind']=='field' and429                   not self._tb_cats[k]['is_custom']]430    def custom_field_keys(self, include_composites=True):431        res = []432        for k in self._tb_cats.keys():433            fm = self._tb_cats[k]434            if fm['kind']=='field' and fm['is_custom'] and \435                   (fm['datatype'] != 'composite' or include_composites):436                res.append(k)437        return res438    def all_field_keys(self):439        return [k for k in self._tb_cats.keys() if self._tb_cats[k]['kind']=='field']440    def iterkeys(self):441        for key in self._tb_cats:442            yield key443    def itervalues(self):444        return self._tb_cats.itervalues()445    def values(self):446        return self._tb_cats.values()447    def iteritems(self):448        for key in self._tb_cats:449            yield (key, self._tb_cats[key])450    def custom_iteritems(self):451        for key, meta in self._tb_custom_fields.iteritems():452            yield (key, meta)453    def items(self):454        return list(self.iteritems())455    def is_custom_field(self, key):456        return key.startswith(self.custom_field_prefix)457    def is_ignorable_field(self, key):458        'Custom fields and user categories are ignorable'459        return self.is_custom_field(key) or key.startswith('@')460    def ignorable_field_keys(self):461        return [k for k in self._tb_cats.iterkeys() if self.is_ignorable_field(k)]462    def is_series_index(self, key):463        m = self[key]464        return (m['datatype'] == 'float' and key.endswith('_index') and465                key[:-6] in self)466    def key_to_label(self, key):467        if 'label' not in self._tb_cats[key]:468            return key469        return self._tb_cats[key]['label']470    def label_to_key(self, label, prefer_custom=False):471        if prefer_custom:472            if label in self.custom_label_to_key_map:473                return self.custom_label_to_key_map[label]474        if 'label' in self._tb_cats:475            return label476        if not prefer_custom:477            if label in self.custom_label_to_key_map:478                return self.custom_label_to_key_map[label]479        raise ValueError('Unknown key [%s]'%(label))480    def all_metadata(self):481        l = {}482        for k in self._tb_cats:483            l[k] = self._tb_cats[k]484        return l485    def custom_field_metadata(self, include_composites=True):486        if include_composites:487            return self._tb_custom_fields488        l = {}489        for k in self.custom_field_keys(include_composites):490            l[k] = self._tb_cats[k]491        return l492    def add_custom_field(self, label, table, column, datatype, colnum, name,493                         display, is_editable, is_multiple, is_category,494                         is_csp=False):495        key = self.custom_field_prefix + label496        if key in self._tb_cats:497            raise ValueError('Duplicate custom field [%s]'%(label))498        if datatype not in self.VALID_DATA_TYPES:499            raise ValueError('Unknown datatype %s for field %s'%(datatype, key))500        self._tb_cats[key] = {'table':table,       'column':column,501                             'datatype':datatype,  'is_multiple':is_multiple,502                             'kind':'field',       'name':name,503                             'search_terms':[key], 'label':label,504                             'colnum':colnum,      'display':display,505                             'is_custom':True,     'is_category':is_category,506                             'link_column':'value','category_sort':'value',507                             'is_csp' : is_csp,     'is_editable': is_editable,}508        self._tb_custom_fields[key] = self._tb_cats[key]509        self._add_search_terms_to_map(key, [key])510        self.custom_label_to_key_map[label] = key511        if datatype == 'series':512            key += '_index'513            self._tb_cats[key] = {'table':None,        'column':None,514                                 'datatype':'float',   'is_multiple':{},515                                 'kind':'field',       'name':'',516                                 'search_terms':[key], 'label':label+'_index',517                                 'colnum':None,        'display':{},518                                 'is_custom':False,    'is_category':False,519                                 'link_column':None,   'category_sort':None,520                                 'is_editable': False, 'is_csp': False}521            self._add_search_terms_to_map(key, [key])522            self.custom_label_to_key_map[label+'_index'] = key523    def remove_dynamic_categories(self):524        for key in list(self._tb_cats.keys()):525            val = self._tb_cats[key]526            if val['is_category'] and val['kind'] in ('user', 'search'):527                for k in self._tb_cats[key]['search_terms']:528                    if k in self._search_term_map:529                        del self._search_term_map[k]530                del self._tb_cats[key]531    def remove_user_categories(self):532        for key in list(self._tb_cats.keys()):533            val = self._tb_cats[key]534            if val['is_category'] and val['kind']  == 'user':535                for k in self._tb_cats[key]['search_terms']:536                    if k in self._search_term_map:537                        del self._search_term_map[k]538                del self._tb_cats[key]539    def _remove_grouped_search_terms(self):540        to_remove = [v for v in self._search_term_map541                        if isinstance(self._search_term_map[v], list)]542        for v in to_remove:543            del self._search_term_map[v]544    def add_grouped_search_terms(self, gst):545        self._remove_grouped_search_terms()546        for t in gst:547            try:548                self._add_search_terms_to_map(gst[t], [t])549            except ValueError:550                traceback.print_exc()551    def cc_series_index_column_for(self, key):552        return self._tb_cats[key]['rec_index'] + 1553    def add_user_category(self, label, name):554        if label in self._tb_cats:555            raise ValueError('Duplicate user field [%s]'%(label))556        st = [label]557        if icu_lower(label) != label:558            st.append(icu_lower(label))559        self._tb_cats[label] = {'table':None,          'column':None,560                                'datatype':None,       'is_multiple':{},561                                'kind':'user',         'name':name,562                                'search_terms':st,     'is_custom':False,563                                'is_category':True,    'is_csp': False}564        self._add_search_terms_to_map(label, st)565    def add_search_category(self, label, name):566        if label in self._tb_cats:567            raise ValueError('Duplicate user field [%s]'%(label))568        self._tb_cats[label] = {'table':None,        'column':None,569                                'datatype':None,     'is_multiple':{},570                                'kind':'search',     'name':name,571                                'search_terms':[],   'is_custom':False,572                                'is_category':True,  'is_csp': False}573    def set_field_record_index(self, label, index, prefer_custom=False):574        if prefer_custom:575            key = self.custom_field_prefix+label576            if key not in self._tb_cats:577                key = label578        else:579            if label in self._tb_cats:580                key = label581            else:582                key = self.custom_field_prefix+label583        self._tb_cats[key]['rec_index'] = index  # let the exception fly ...584    def get_search_terms(self):585        s_keys = sorted(self._search_term_map.keys())586        for v in self.search_items:587            s_keys.append(v)588        return s_keys589    def _add_search_terms_to_map(self, key, terms):590        if terms is not None:591            for t in terms:592                if t in self._search_term_map:593                    raise ValueError('Attempt to add duplicate search term "%s"'%t)594                self._search_term_map[t] = key595    def search_term_to_field_key(self, term):596        return self._search_term_map.get(term, term)597    def searchable_fields(self):598        return [k for k in self._tb_cats.keys()599                if self._tb_cats[k]['kind']=='field' and...042.3_Create_decorator_which_has_parameter.py
Source:042.3_Create_decorator_which_has_parameter.py  
1# Set parameter x which decorator will use2def is_multiple(x):3    # func is function which you will call4    def real_decorator(func):5        # Same function prototype with func6        def wrapper(a,b):7            # Call func8            r=func(a,b)9            # Check using if statement10            if r%x==0:11              print('{0}ì ë°íê°ì {1}ì ë°°ìì
ëë¤.'.format(func.__name__, x))12            else:13              print('{0}ì ë°íê°ì {1}ì ë°°ìê° ìëëë¤.'.format(func.__name__, x))14            # Return return value of func15            return r16        # Return wrapper()17        return wrapper18    # Return real_decorator()19    return real_decorator20# Pass argument as you use decorator21@is_multiple(3)22def add(a,b):23  return a+b24print(add(10,20))25print(add(2,5))26# ================================================================================27# Use multiple decorators which has parameter28@Decorator1(arg)29@Decorator2(arg)30def func_name():31  code32@is_multiple(3)33@is_multiple(7)34def add(a,b):35  return a+b36 37add(10, 20)38# ================================================================================39# Same code but without using decorator40decorated_add=is_multiple(3)(is_multiple(7)(add))41decorated_add(10,20)42# ================================================================================43import functools44 45def is_multiple(x):46  def real_decorator(func):47    # Pass func to functools.wraps()48    # And decorate it above wrapper()49    @functools.wraps(func)50    def wrapper(a, b):51      r = func(a, b)52      if r % x == 0:53        print('{0}ì ë°íê°ì {1}ì ë°°ìì
ëë¤.'.format(func.__name__, x))54      else:55        print('{0}ì ë°íê°ì {1}ì ë°°ìê° ìëëë¤.'.format(func.__name__, x))56      return r57    return wrapper58  return real_decorator59 60@is_multiple(3)61@is_multiple(7)62def add(a,b):63  return a+b64 65add(10, 20)66# addì ë°íê°ì 7ì ë°°ìê° ìëëë¤.67# addì ë°íê°ì 3ì ë°°ìì
ëë¤.68# @functools.wraps preserves information of original function...json_codec.py
Source:json_codec.py  
...18            v = object_to_unicode(v)19            ans[k] = v20        return ans21    return obj22def encode_is_multiple(fm):23    if fm.get('is_multiple', None):24        # migrate is_multiple back to a character25        fm['is_multiple2'] = fm.get('is_multiple', {})26        dt = fm.get('datatype', None)27        if dt == 'composite':28            fm['is_multiple'] = ','29        else:30            fm['is_multiple'] = '|'31    else:32        fm['is_multiple'] = None33        fm['is_multiple2'] = {}34def decode_is_multiple(fm):35    im = fm.get('is_multiple2',  None)36    if im:37        fm['is_multiple'] = im38        del fm['is_multiple2']39    else:40        # Must migrate the is_multiple from char to dict41        im = fm.get('is_multiple',  {})42        if im:43            dt = fm.get('datatype', None)44            if dt == 'composite':45                im = {'cache_to_list': ',', 'ui_to_list': ',',46                      'list_to_ui': ', '}47            elif fm.get('display', {}).get('is_names', False):48                im = {'cache_to_list': '|', 'ui_to_list': '&',...Qn_17.py
Source:Qn_17.py  
...34import sys567def is_multiple(n, f):8    h = n % f9    if h == 0:10        return True11    if h != 0:12        return False131415def test(did_pass):16    """  Print the result of a test.  """17    linenum = sys._getframe(1).f_lineno   # Get the caller's line number.18    if did_pass:19        msg = "Test at line {0} ok.".format(linenum)20    else:21        msg = ("Test at line {0} FAILED.".format(linenum))22    print(msg)232425def test_suite():26    """ Run the suite of tests for code in this module (this file).27    """28    test(is_multiple(12, 3))29    test(is_multiple(12, 4))30    test(not is_multiple(12, 5))31    test(is_multiple(12, 6))32    test(not is_multiple(12, 7))333435test_suite()3637# b)3839import sys404142def is_factor(f, n):43    h = n % f44    if h == 0:45        return True46    if h != 0:47        return False484950def is_multiple(n, f):51    if is_factor(f, n) == True:52        return True53    if is_factor(f, n) == False:54        return False5556def test(did_pass):57    """  Print the result of a test.  """58    linenum = sys._getframe(1).f_lineno   # Get the caller's line number.59    if did_pass:60        msg = "Test at line {0} ok.".format(linenum)61    else:62        msg = ("Test at line {0} FAILED.".format(linenum))63    print(msg)646566def test_suite():67    """ Run the suite of tests for code in this module (this file).68    """69    test(is_multiple(12, 3))70    test(is_multiple(12, 4))71    test(not is_multiple(12, 5))72    test(is_multiple(12, 6))73    test(not is_multiple(12, 7))7475
...LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!
