tokenize- 用于Python源代码的Python – Python语言服务(Python教程)(参考资料)

tokenize– Python源代码

源代码: Lib / tokenize.py


tokenizemodule为Python源代码提供了一个词法扫描程序,用Python实现。该模块中的扫描仪可以很好地返回注释,这对于实现“漂亮的打印机”非常有用,包括用于屏幕显示的彩色打印机.

为了简化令牌流处理,所有运营商和分隔符代币和Ellipsis使用通用OP令牌类型。确切的类型可以通过检查exact_type上的财产命名为元组从返回tokenize.tokenize().

令牌输入

主要入口点是发电机:

tokenize.tokenizereadline
tokenize()生成器需要一个参数readline,它必须是一个可调用的对象,它提供相同的接口作为io.IOBase.readline()文件对象的方法。每次调用函数都应返回一行输入为bytes.

生成器使用这些成员生成5元组:令牌类型;thetoken字符串;一个2元组(srow, scol)的int,指定令牌在源中开始的行和列;一个2元组(erow, ecol) ofints指定令牌在源中结束的行和列;以及发现令牌的行。通过的行(最后一个元组项)是logical行;包括延续线。5元组以命名元组返回,字段名称为:type string start end line.

返回的命名元组还有一个元组名为exact_type的属性,包含OP标记的确切运算符类型。对于所有其他令牌类型exact_type等于命名元组type字段

更改版本3.1:添加对命名元组的支持.

在版本3.3中更改:根据exact_type.

tokenize() PEP 263,添加了对的支持,通过查找aUTF-8 BOM或编码cookie来确定文件的源编码.

token模块中的所有常量也从tokenize.

提供另一个函数来反转标记化过程。这对于创建标记脚本,修改标记流和写回修改过的脚本的工具是有用的.

tokenize.untokenize (iterable )
将标记转换回Python源代码。iterable必须返回带有至少两个元素的序列,即令牌类型和令牌字符串。忽略任何其他序列元素.

重建的脚本作为单个字符串返回。结果保证将标记化返回以匹配输入,以便转换无损并且确保往返。保证仅适用于口令类型和令牌字符串,因为令牌(列位置)之间的间距可能会改变.

它返回使用ENCODING标记编码的字节,这是由tokenize().

tokenize()需要检测它标记的源文件的编码。它可以用来做这个功能:

tokenize.detect_encodingreadline
detect_encoding()function用于检测应该用于解码Python源文件的编码。它需要一个参数,readline,就像tokenize() generator.

它将最多调用readline两次,并返回使用的编码(作为字符串)和它已读取的任何行的列表(不是从字节解码)

它根据 PEP 263 中指定的UTF-8 BOM或encodingcookie的存在来检测编码。如果BOM和cookie都存在但不同意,则SyntaxError将被提出。请注意,如果找到BOM,"utf-8-sig"将作为编码返回

如果没有指定编码,则"utf-8"的默认值将被返回.

使用 open()打开Python源文件:它使用detect_encoding()来检测文件编码.

tokenize.open(filename)
使用编码以只读模式打开文件检测到detect_encoding().

版本3.2.

exception tokenize.TokenError
当在文件中的任何位置都没有完成可能分割成多行的文档字符串或表达式时引发,例如:

"""Beginning of  docstring

或:

[1,   2,   3

请注意,未闭合的单引号字符串不会导致错误。它们被标记为ERRORTOKEN,随后是其内容的说明.

 

命令 – 线使用

版本3.3中的新内容

// tokenize模块可以从命令行作为脚本执行。它很简单:

python -m tokenize [-e] [filename.py]

接受以下选项:

-h, --help
显示此帮助信息并退出
-e, --exact
使用确切的类型显示令牌名称

如果指定了filename.py,则将其内容标记为stdout.Otherwise,在stdin上执行标记化

示例

将float文字转换为Decimalobjects的脚本重写器示例:

from tokenize import tokenize, untokenize, NUMBER, STRING, NAME, OP  from io import BytesIO    def decistmt(s):      """Substitute Decimals for floats in a string of statements.        >>> from decimal import Decimal      >>> s = 'print(+21.3e-5*-.1234/81.7)'      >>> decistmt(s)      "print (+Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7'))"        The format of the exponent is inherited from the platform C library.      Known cases are "e-007" (Windows) and "e-07" (not Windows).  Since      we're only showing 12 digits, and the 13th isn't close to 5, the      rest of the output should be platform-independent.        >>> exec(s)  #doctest: +ELLIPSIS      -3.21716034272e-0...7        Output from calculations with Decimal should be identical across all      platforms.        >>> exec(decistmt(s))      -3.217160342717258261933904529E-7      """      result = []      g = tokenize(BytesIO(s.encode('utf-8')).readline)  # tokenize the string      for toknum, tokval, _, _, _ in g:          if toknum == NUMBER and '.' in tokval:  # replace NUMBER tokens              result.extend([                  (NAME, 'Decimal'),                  (OP, '('),                  (STRING, repr(tokval)),                  (OP, ')')              ])          else:              result.append((toknum, tokval))      return untokenize(result).decode('utf-8')

从命令行进行标记化的示例。脚本:

def say_hello():      print("Hello, World!")    say_hello()

将被标记为以下输出,其中第一列是找到标记的行/列坐标的范围,第二列是标记的名称,最后一列是值令牌(如果有的话)

$ python -m tokenize hello.py  0,0-0,0:            ENCODING       'utf-8'  1,0-1,3:            NAME           'def'  1,4-1,13:           NAME           'say_hello'  1,13-1,14:          OP             '('  1,14-1,15:          OP             ')'  1,15-1,16:          OP             ':'  1,16-1,17:          NEWLINE        'n'  2,0-2,4:            INDENT         '    '  2,4-2,9:            NAME           'print'  2,9-2,10:           OP             '('  2,10-2,25:          STRING         '"Hello, World!"'  2,25-2,26:          OP             ')'  2,26-2,27:          NEWLINE        'n'  3,0-3,1:            NL             'n'  4,0-4,0:            DEDENT         ''  4,0-4,9:            NAME           'say_hello'  4,9-4,10:           OP             '('  4,10-4,11:          OP             ')'  4,11-4,12:          NEWLINE        'n'  5,0-5,0:            ENDMARKER      ''

可以使用-e选项:

$ python -m tokenize -e hello.py  0,0-0,0:            ENCODING       'utf-8'  1,0-1,3:            NAME           'def'  1,4-1,13:           NAME           'say_hello'  1,13-1,14:          LPAR           '('  1,14-1,15:          RPAR           ')'  1,15-1,16:          COLON          ':'  1,16-1,17:          NEWLINE        'n'  2,0-2,4:            INDENT         '    '  2,4-2,9:            NAME           'print'  2,9-2,10:           LPAR           '('  2,10-2,25:          STRING         '"Hello, World!"'  2,25-2,26:          RPAR           ')'  2,26-2,27:          NEWLINE        'n'  3,0-3,1:            NL             'n'  4,0-4,0:            DEDENT         ''  4,0-4,9:            NAME           'say_hello'  4,9-4,10:           LPAR           '('  4,10-4,11:          RPAR           ')'  4,11-4,12:          NEWLINE        'n'  5,0-5,0:            ENDMARKER      ''

文章导航

  • 标记输入
  • 命令行用法
  • 示例
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。
超哥软件库 » tokenize- 用于Python源代码的Python – Python语言服务(Python教程)(参考资料)