首页 文章

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

提问于
浏览
6

我在Python中使用 tokenize 模块并想知道为什么有2个不同的换行符:

NEWLINE = 4
NL = 54

任何产生两个令牌的代码示例都将受到赞赏 .

3 回答

  • 1

    根据python文档:

    tokenize.NL用于表示非终止换行符的标记值 . NEWLINE标记表示Python代码逻辑行的结束;当在多条物理线路上继续执行逻辑代码行时,生成NL令牌 .

    更多这里:https://docs.python.org/2/library/tokenize.html

  • 5

    Python代码中至少有4种可能的 '\n' 案例;其中2个由令牌编纂:

    • 语句终止换行符:tokenize.NEWLINE - 这是或多或少对应于C或Java ; 的标记 .

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

    • 多行字符串中的换行符 .

    • 在行继续 \ 处发生的换行符 - 与文档似乎表明的相反,此案例根本不产生任何令牌 .

    因此以下示例:

    # 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       ''
    
  • 2

    除了the docs的报价

    NEWLINE标记表示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' 之后的 1,13-1,14: NL '\n'


    基本上,NEWLINE和NL之间的区别在于NL是在一条非“完整”的行之后生成的:

    def a_func(a, b):
    

    结果为NEWLINE,因为整个逻辑行位于1条物理线上

    def another_func(a,
                     b)
    

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

相关问题