化异为同,Python 在背后帮你做的转换

简介: 化异为同,Python 在背后帮你做的转换

摄影:产品经理又是产品经理自己去吃的烤肉

我们先来看一段代码,这段代码似乎触发了Python的bug:


>>> 𝑓 = 1>>> f = 2>>> print(𝑓)

运行效果如下图所示:


我们知道,Python 的变量名是可以使用 Unicode 字符的,也就是非英文字母也可以当做变量名,例如:


如果大家仔细观察,就会发现上面的𝑓和英文字母f不是同一个字符。

那为什么当我们给f赋值为2以后,原来𝑓的值也改变了呢?这是因为,Python 会把所有的变量名转换为它的 NFKC 等价形式。

从Python的官方文档2.3. Identifiers and keywords[1]中,我们可以看到:

All identifiers are converted into the normal form NFKC while parsing; comparison of identifiers is based on NFKC.

转换的原理可以参阅维基百科:Unicode equivalence - Wikipedia[2]

Python已经自带了一个转换的模块,叫做unicodedata,通过它,我们可以把非标准的Unicode字符转成标准的Unicode字符,例如:


>>> import unicodedata>>> unicodedata.normalize('NFKC', '𝑓')'f'>>> unicodedata.normalize('NFKC', '𝑓') == 'f'True

可以看到,手写字符𝑓通过 NFKC 标准转换以后,就是普通的字母f,所以在 Python 里面,如果作为变量名,这两个字符是一样的。

除了英文字符外,中文字符也可以转换。大家应该还记得我之前讲康熙字符那篇文章:康熙部首导致的字典查询异常我们可以使用相同的方式,把康熙部首里面的转换为标准的汉字


>>> unicodedata.normalize('NFKC', '⽐') == '比'True

这样一来,如果你需要做一个服务,它接收用户的输入,但你又不想让用户输入这种长得像中文或者英文,但是却又不是的怪异字符,你就可以使用 NFKC 把它转换为标准的字符。例如,把中文逗号转成英文逗号,把中文分号转成英文分号,把中文冒号转成英文冒号等等:

目录
相关文章
|
数据库 数据安全/隐私保护
【课程设计】招聘系统的设计与实现
【课程设计】招聘系统的设计与实现
252 0
|
编解码 内存技术
四款好用的免费直播编码推流软件
现代生活已经离不开互联网,离不开软件了。 这说法毫不夸张。 比如手机上各种APP眼花缭乱 ,各种行业, 各种功能, 各种Logo, 各种的各种。 没有良好的整理力,是真 的不好意思让别人看到啊。 这些功能各异的APP程序大多数是免费APP。
7533 0
|
7月前
|
JavaScript 前端开发 API
如何在React.js中使用Shadcn/UI
学习如何在React.js中使用Shadcn/UI构建轻量且可定制的现代化界面。Shadcn/UI为React.js打造,提供核心组件和Tailwind CSS支持,帮助你创建独特的UI,避免大型框架的臃肿。本文介绍安装、配置及与Apipost集成的方法,适合希望提升React.js项目的开发者。通过定制主题和优化性能,你可以高效地开发出功能强大的应用。
|
数据采集 算法 测试技术
深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战
深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战
515 1
|
移动开发 Java Android开发
Android应用开发:Kotlin语言的优势与实践
【5月更文挑战第7天】 在移动开发的世界中,Android平台的Kotlin语言以其高效、简洁的语法和强大的功能吸引了众多开发者。本文将深入探讨Kotlin语言的核心优势,并通过实际案例展示如何在Android应用开发中有效地运用这一现代编程语言。我们将从语言特性出发,逐步分析其在提升开发效率、改善代码质量以及增强应用性能方面的具体表现,为读者提供一个全面而细致的Kotlin应用开发指南。
|
小程序 C#
C#工程建立后修改工程文件名与命名空间
使用之前的项目做二次开发,项目快结束的时候,需要把主项目的名称修改成我们想要的。 之前从来没有这么干过,记录一下。
316 0
|
弹性计算 容灾 定位技术
阿里云服务器地域和可用区关系与选择参考
阿里云服务器的地域既有国内地域,也有国外地域,同一地域往往还有多个可用区可选,那么阿里云服务器的地域和可用区有什么关系,我们应该如何选择呢?本文介绍阿里云地域和可用区的概念、选择指导、两者的关系以及阿里云支持的地域和可用区列表。
1409 1
阿里云服务器地域和可用区关系与选择参考
|
JavaScript 前端开发 编译器
极速 JavaScript 打包器:esbuild
esbuild是一个快速、可扩展的JavaScript打包器和压缩器,它的目标是成为最快的打包器。它使用Go编写,可以在几乎瞬间内完成大多数项目的构建。在本文中,我们将深入了解esbuild,并探讨其如何实现如此出色的性能。
298 0
|
Linux 测试技术 数据库
我的SIP开发之路
http://hi.baidu.com/ltlovelty/blog/item/837baf1ece7fc6f11ad57647.html     经过对SIP协议和开源协议栈快半年的研究,我现在终于有点入门了。
3979 0