<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def description_for_valid_number(numobj, lang, script=None, region=None):
 """Return a text description of a PhoneNumber object, in the language provided. The description might consist of the name of the country where the phone number is from and/or the name of the geographical area the phone number is from if more detailed information is available. If the phone number is from the same region as the user, only a lower-level description will be returned, if one exists. Otherwise, the phone number's region will be returned, with optionally some more detailed information. For example, for a user from the region "US" (United States), we would show "Mountain View, CA" for a particular number, omitting the United States from the description. For a user from the United Kingdom (region "GB"), for the same number we may show "Mountain View, CA, United States" or even just "United States". This function assumes the validity of the number passed in has already been checked, and that the number is suitable for geocoding. We consider fixed-line and mobile numbers possible candidates for geocoding. Arguments: numobj -- A valid PhoneNumber object for which we want to get a text description. lang -- A 2-letter lowercase ISO 639-1 language code for the language in which the description should be returned (e.g. "en") script -- A 4-letter titlecase (first letter uppercase, rest lowercase) ISO script code as defined in ISO 15924, separated by an underscore (e.g. "Hant") region -- The region code for a given user. This region will be omitted from the description if the phone number comes from this region. It should be a two-letter upper-case CLDR region code. Returns a text description in the given language code, for the given phone number, or an empty string if the number could come from multiple countries, or the country code is in fact invalid."""

    number_region = region_code_for_number(numobj)
    if region is None or region == number_region:
        mobile_token = country_mobile_token(numobj.country_code)
        national_number = national_significant_number(numobj)
        if mobile_token != U_EMPTY_STRING and national_number.startswith(mobile_token):
            # In some countries, eg. Argentina, mobile numbers have a mobile token
            # before the national destination code, this should be removed before
            # geocoding.
            national_number = national_number[len(mobile_token):]

            region = region_code_for_country_code(numobj.country_code)
            try:
                copied_numobj = parse(national_number, region)
            except NumberParseException:
                # If this happens, just re-use what we had.
                copied_numobj = numobj
            area_description = _prefix_description_for_number(GEOCODE_DATA, GEOCODE_LONGEST_PREFIX,
                                                              copied_numobj, lang, script, region)
        else:
            area_description = _prefix_description_for_number(GEOCODE_DATA, GEOCODE_LONGEST_PREFIX,
                                                              numobj, lang, script, region)
        if area_description != "":
            return area_description
        else:
            # Fall back to the description of the number's region
            return country_name_for_number(numobj, lang, script, region)
    else:
        # Otherwise, we just show the region(country) name for now.
        return _region_display_name(number_region, lang, script, region)