<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def preferred_mmol(code):
 """ Get mmol number of preferred biological assembly as listed in the PDBe. Notes ----- First checks for code in mmols.json. If code not yet in this json dictionary, uses requests module to scrape the PDBE for the preferred mmol number. Parameters code : str A PDB code. Returns ------- mmol : int mmol number of preferred assembly. Raises ------ TypeError If 'mmol number' scraped is not an integer. """

    # If preferred mmol number is already known, return it
    if code in mmols_numbers.keys():
        mmol = mmols_numbers[code][1]
        return mmol
    elif is_obsolete(code):
        raise ValueError('Obsolete PDB code {0}'.format(code))
    # Otherwise, use requests to scrape the PDBE.
    else:
        url_string = "http://www.ebi.ac.uk/pdbe/entry/pdb/{0}/analysis".format(code)
        r = requests.get(url_string)
        if not r.ok:
            raise IOError("Could not get to url {0}".format(url_string))
        r_content = r.text
        ass = re.findall('Assembly\s\d+\s\(preferred\)', r_content)
        if len(ass) != 1:
            # To catch a strange error in the pdbe where preferred assembly is not numbered. See for example
            # http://www.ebi.ac.uk/pdbe/entry/pdb/7msi/analysis
            ass = re.findall('Assembly\s+\(preferred\)', r_content)
            if len(ass) == 1:
                return 1
            obs = re.findall('Entry has been obsoleted and replaced by another entry \(OBS\)', r_content)
            if len(obs) == 1:
                rep = re.findall('by entry <a href="/pdbe/entry/pdb/\w{4}', r_content)
                if len(rep) == 1:
                    rep = rep[0][-4:]
                    raise IOError("{0} is obsolete and has been replaced by {1}.".format(code, rep))
            raise ValueError("More than one match to preferred assembly")
        mmol = ass[0].split()[1]
        try:
            mmol = int(mmol)
        except TypeError:
            raise TypeError("Unexpected match: non-integer mmol")
        return mmol