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

时间:2014-07-01 20:49:37

标签: python tokenize

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

NEWLINE = 4
NL = 54

任何会生成这两个令牌的代码示例都会受到赞赏。

3 个答案:

答案 0 :(得分:5)

根据python文档:

  

tokenize.NL
  令牌值用于表示非终止换行符。 NEWLINE   token表示Python代码的逻辑行的结尾; NL令牌   当逻辑代码行继续多次时生成   物理线路。

更多信息:https://docs.python.org/2/library/tokenize.html

答案 1 :(得分:3)

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

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

  2. 任何未终止声明且不属于案例3或4的换行符:tokenize.NL

  3. 多行字符串中的换行符。

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

  5. 因此以下示例:

    # 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 :(得分:1)

除了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'

之后的a,

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

def a_func(a, b):

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

def another_func(a,
                 b)

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