标记化模块中的Python 2换行标记

标记化模块中的Python 2换行标记,python,tokenize,Python,Tokenize,我正在使用Python中的tokenize模块,不知道为什么有两种不同的换行符: NEWLINE = 4 NL = 54 任何能产生这两个令牌的代码示例都将不胜感激。根据python文档: 标记化.NL 用于指示非终止换行符的标记值。新线 标记表示Python代码逻辑行的结尾;NL代币 当一个逻辑代码行在多个位置上连续时生成 物理线路 更多信息:除了 换行符表示Python代码逻辑行的结尾; NL令牌是在逻辑代码行继续执行时生成的 多条物理线路 这里有一个例子 def a_func(a, b)

我正在使用Python中的
tokenize
模块,不知道为什么有两种不同的换行符:

NEWLINE = 4
NL = 54

任何能产生这两个令牌的代码示例都将不胜感激。

根据python文档:

标记化.NL
用于指示非终止换行符的标记值。新线 标记表示Python代码逻辑行的结尾;NL代币 当一个逻辑代码行在多个位置上连续时生成 物理线路


更多信息:

除了

换行符表示Python代码逻辑行的结尾; NL令牌是在逻辑代码行继续执行时生成的 多条物理线路

这里有一个例子

def a_func(a, b):
    pass
这将产生

1,0-1,3:        NAME    'def'
1,4-1,10:       NAME    'a_func'
1,10-1,11:      OP      '('
1,11-1,12:      NAME    'a'
1,12-1,13:      OP      ','
1,14-1,15:      NAME    'b'
1,15-1,16:      OP      ')'
1,16-1,17:      OP      ':'
1,17-1,18:      NEWLINE '\n'
2,0-2,4:        INDENT  '    '
2,4-2,8:        NAME    'pass'
2,8-2,9:        NEWLINE '\n'
3,0-3,0:        DEDENT  ''
鉴于

def a_func(a,
           b):
    pass
会产生这个

1,0-1,3:        NAME    'def'
1,4-1,10:       NAME    'a_func'
1,10-1,11:      OP      '('
1,11-1,12:      NAME    'a'
1,12-1,13:      OP      ','
1,13-1,14:      NL      '\n'
2,11-2,12:      NAME    'b'
2,12-2,13:      OP      ')'
2,13-2,14:      OP      ':'
2,14-2,15:      NEWLINE '\n'
3,0-3,4:        INDENT  '    '
3,4-3,8:        NAME    'pass'
3,8-3,9:        NEWLINE '\n'
4,0-4,0:        DEDENT  ''
4,0-4,0:        ENDMARKER       ''
注意
1,13-1,14:NL'\n'
a之后,


基本上,换行符和NL之间的区别在于NL是在未“完成”的行之后生成的:

def a_func(a, b):
结果为换行,因为整个逻辑行位于一个物理行上

def another_func(a,
                 b)

结果在NL中,因为1条逻辑线的代码分布在2条物理线上

在Python代码中至少有4种可能的情况是
'\n'
;其中2个由代币编码:

  • 语句终止换行符:-这是或多或少与C或Java
    对应的标记

  • 不终止语句且不属于案例3或案例4的任何换行符:

  • 多行字符串中的换行符

  • 一个换行符出现在行继续处
    \
    ——与文档中似乎指出的相反,这种情况根本不会产生任何标记

  • 因此,下面的例子:

    # case 1
    a = 6
    b = 7
    
    # case 2
    answer = (
        a * b
    )
    
    # case 3
    format = """
    A multiline string
    """
    
    # case 4
    print "something that is continued" \
        "on the following line."
    
    给出了所有可能的情况:

    1,0-1,8:        COMMENT '# case 1'
    1,8-1,9:        NL      '\n'
    2,0-2,1:        NAME    'a'
    2,2-2,3:        OP      '='
    2,4-2,5:        NUMBER  '6'
    2,5-2,6:        NEWLINE '\n'
    3,0-3,1:        NAME    'b'
    3,2-3,3:        OP      '='
    3,4-3,5:        NUMBER  '7'
    3,5-3,6:        NEWLINE '\n'
    4,0-4,1:        NL      '\n'
    5,0-5,8:        COMMENT '# case 2'
    5,8-5,9:        NL      '\n'
    6,0-6,6:        NAME    'answer'
    6,7-6,8:        OP      '='
    6,9-6,10:       OP      '('
    6,10-6,11:      NL      '\n'
    7,4-7,5:        NAME    'a'
    7,6-7,7:        OP      '*'
    7,8-7,9:        NAME    'b'
    7,9-7,10:       NL      '\n'
    8,0-8,1:        OP      ')'
    8,1-8,2:        NEWLINE '\n'
    9,0-9,1:        NL      '\n'
    10,0-10,8:      COMMENT '# case 3'
    10,8-10,9:      NL      '\n'
    11,0-11,6:      NAME    'format'
    11,7-11,8:      OP      '='
    11,9-13,3:      STRING  '"""\nA multiline string\n"""'
    13,3-13,4:      NEWLINE '\n'
    14,0-14,1:      NL      '\n'
    15,0-15,8:      COMMENT '# case 4'
    15,8-15,9:      NL      '\n'
    16,0-16,5:      NAME    'print'
    16,6-16,35:     STRING  '"something that is continued"'
    17,4-17,28:     STRING  '"on the following line."'
    17,28-17,29:    NEWLINE '\n'
    18,0-18,0:      ENDMARKER       ''