Python 进阶
Python 协程实现原理
dict 和 set 实现原理
Python 线程安全
Python 抽象语法树(AST)
Python 日志输出
Python 扩展入门(一)
Python 程序执行原理
Python 垃圾回收
Python 动态创建类
检查工具
PyFrameObject
yield 生成器工作原理
dict 设计与实现
Python 性能分析原理
PyCodeObject
Python 弱引用
Python 性能分析原理(二)
Python 源码分析(一)
Python Annotated
Python 依赖注入
python freelist
python代码编译成pyc
Python mmap 内存映射文件
Python值得学习的内容
async Future 对象
asyncio loop的实现
asyncio.sleep 的实现
asyncio 原理
Python 代码加密
Python Token类型
Python 扩展入门(二)
Python 性能优化
本文档使用 MrDoc 发布
-
+
首页
Python Token类型
## 概述 分词器生成的每个token 都有一个类型。这些类型被表示为整数常量。token 常量的实际整数值不重要。相反,应按变量名称引用token,并使用字典获取token 类型的名称。确切的整数值可能会在 Python 版本之间更改,新版本可能新增或删除一些token(事实上,在最新版本的 Python 中,他们已经删除了)。在下面的示例中,输出中显示的token 编号是 Python 3.9 中的编号。 token类型的值都是数字,原因是因为Python 解释器使用的分词器不是`tokenize`模块,它是一个效率更高的使用C编写的实现。C没有像Python这样的对象系统,因此使用整数类型来代替枚举类型(实际上,`tokenizer.c`有一个很大的token类型的数组,每个token 的数值是其在该数组中的索引)。该`tokenize`模块是用纯Python编写的,但是token 类型的值和名称是 C 分词器中的值和名称的镜像,但是有三个例外:`COMMENT` `NL`和 `ENCODING`。 所有token 类型都在`token`模块中定义(这是一个C编写的模块),但`tokenize`模块有这么一句代码:`from token import *` ,因此也可以从`tokenize`中导入它们。 最简单的方法就是从`tokenize`导入所有内容。 此外,上述`COMMENT` `NL`和 `ENCODING` 在 Python 3.7 之前不能从 `token`中导入, 仅可以从 `tokenize`中导入。 ## tok_name 字典 `tok_name`字典保存了token和它们名称的映射: ``` >>> import tokenize >>> tokenize.STRING 3 >>> tokenize.tok_name[tokenize.STRING] # Can also use token.tok_name 'STRING' ``` ## token类型介绍 先定义一个函数,下面的示例都会用到这个函数 ``` import io def print_tokens(s): for tok in tokenize.tokenize(io.BytesIO(s.encode('utf-8')).readline): print(tok) ``` 这里我们调用了`tokenize()`函数,这个函数会对代码进行词法分析,将代码解析成一个个的token,每个token包含以下信息: ``` TokenInfo: - type:当前token的类型; - string:当前token的字面内容; - start:tuple类型,表示起始行和起始列; - end:tuple类型,表示结束行和结束列; - line:当前token所在的行; ``` 示例: ``` >>> print_tokens('x + 1\n') TokenInfo(type=63 (ENCODING), string='utf-8', start=(0, 0), end=(0, 0), line='') TokenInfo(type=1 (NAME), string='x', start=(1, 0), end=(1, 1), line='x + 1\n') TokenInfo(type=54 (OP), string='+', start=(1, 2), end=(1, 3), line='x + 1\n') TokenInfo(type=2 (NUMBER), string='1', start=(1, 4), end=(1, 5), line='x + 1\n') TokenInfo(type=4 (NEWLINE), string='\n', start=(1, 5), end=(1, 6), line='x + 1\n') TokenInfo(type=0 (ENDMARKER), string='', start=(2, 0), end=(2, 0), line='') ``` #### ENDMARKER=0 结束符 `tokenize()`最后总是会触发这个结束符。 ``` >>> print_tokens('x + 1\n') TokenInfo(type=63 (ENCODING), string='utf-8', start=(0, 0), end=(0, 0), line='') TokenInfo(type=1 (NAME), string='x', start=(1, 0), end=(1, 1), line='x + 1\n') TokenInfo(type=54 (OP), string='+', start=(1, 2), end=(1, 3), line='x + 1\n') TokenInfo(type=2 (NUMBER), string='1', start=(1, 4), end=(1, 5), line='x + 1\n') TokenInfo(type=4 (NEWLINE), string='\n', start=(1, 5), end=(1, 6), line='x + 1\n') TokenInfo(type=0 (ENDMARKER), string='', start=(2, 0), end=(2, 0), line='') ``` #### NAME=1 标识符 该类型的token被用于所有标识符,包括 关键字/变量名/函数名/类名 等。 #### NUMBER=2 数字 该类型的token用于字面值为数字的数据,包括 整数/二进制/八进制/十六进制。 #### STRING=3 字符串 #### NEWLINE=4 #### INDENT=5 #### DEDENT=6 #### RARROW #### ELLIPSIS #### OP #### AWAIT #### ASYNC #### TYPE_IGNORE #### TYPE_COMMENT #### SOFT_KEYWORD #### ERRORTOKEN #### COMMENT=61 #### NL #### ENCODING #### N_TOKENS ## 参考 > [The Token Types](https://www.asmeurer.com/brown-water-python/tokens.html) > [Python Tokens](https://unacademy.com/content/cbse-class-11/study-material/computer-science/python-tokens/)
gaojian
2023年10月10日 10:19
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码