为何QLocale.system()与语言代码构造的QLocale实例不相等?
QLocale系统实例与pt_BR实例不相等的原因分析
问题场景
系统区域设置为葡萄牙语(巴西)时,通过QLocale.system()获取的实例,其语言和国家属性显示正确:
>>> sys_locale = QLocale.system() >>> QLocale.languageToString(sys_locale.language()) 'Portuguese' >>> QLocale.countryToString(sys_locale.country()) 'Brazil'
但直接与QLocale('pt_BR')实例比较时,结果却不相等:
>>> sys_locale == QLocale('pt_BR') False
而用系统实例的语言、国家参数构造新实例后,与QLocale('pt_BR')比较则完全匹配:
>>> pt_br = QLocale(sys_locale.language(), sys_locale.country()) >>> pt_br == QLocale('pt_BR') True
核心原因
这是因为系统区域设置包含的信息远不止语言和国家,QLocale的相等比较会校验所有区域属性,而非仅语言和国家两项:
QLocale.system()返回的实例会携带系统层面的额外配置,比如字符编码细节、日期/时间格式的本地化变种、货币符号的特殊规则,甚至是系统自定义的区域变体参数,这些都会被纳入相等判断逻辑。- 直接用
QLocale('pt_BR')构造的实例,是基于标准葡萄牙语(巴西)的通用模板创建的,只包含该区域的默认配置,没有系统特有的自定义设置。 - 当你提取
sys_locale的language()和country()构造新实例时,相当于只保留了核心的语言国家属性,忽略了系统实例中的其他额外配置,因此这个新实例与标准QLocale('pt_BR')的所有属性完全匹配,比较结果为True。
另外需要注意,QLocale的==运算符是严格比较,会检查name()、script()、variant()等所有属性的一致性,系统实例的variant或其他次要属性,大概率和标准实例存在差异,这就是直接比较不相等的关键原因。
内容的提问来源于stack exchange,提问作者Giovanni L
相关产品推荐
相关产品推荐

