您的代码失败的原因+39
是被多个国家(意大利和梵蒂冈)使用,正如您引用的评论所解释的那样,在这种情况下,该函数不会返回任何内容,因为该地区不明确。(虽然库中的一些函数似乎只使用了主要区域)。
因此,如果您想要主要区域(返回"Italy"
),这是我的固定功能:
import phonenumbers.geocoder
def country_name_for_number(p: phonenumbers.PhoneNumber, lang="en") -> str:
rc = phonenumbers.geocoder.region_code_for_country_code(p.country_code)
return phonenumbers.geocoder._region_display_name(rc, lang)
或者,如果您想要所有区域(返回["Italy", "Vatican"]
)
def country_names_for_number(p: phonenumbers.PhoneNumber, lang="en") -> list[str]:
rcs = phonenumbers.geocoder.region_codes_for_country_code(p.country_code)
return [phonenumbers.geocoder._region_display_name(rc, lang) for rc in rcs]
原评论:
我能够重现country_name_for_number
不返回任何东西的问题。我检查了源代码,它在内部调用region_code_for_country_code
查找 2 个字母代码 ( +39...
-> IT
),然后使用LOCALE_DATA
内部的字典_region_display_name
来查找代码 ( IT
-> Italy
)。交互式:
import phonenumbers.geocoder
c = phonenumbers.parse("+39391359045341")
print(phonenumbers.geocoder.country_name_for_number(c, "en")) # returns 'None'?!
print(phonenumbers.geocoder.region_code_for_country_code(c.country_code)) # 'IT'
print(phonenumbers.geocoder._region_display_name("IT", "en")) # Italy