【问题标题】:Python 2 newline tokens in tokenize module标记化模块中的 Python 2 换行标记
【发布时间】:2014-07-01 20:49:36
【问题描述】:

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

NEWLINE = 4
NL = 54

将不胜感激任何可以生成这两个令牌的代码示例。

【问题讨论】:

    标签: python tokenize


    【解决方案1】:

    根据python文档:

    tokenize.NL
    用于指示非终止换行符的标记值。新线 token 表示 Python 代码逻辑行的结束; NL 代币 当逻辑代码行连续多个时生成 物理线条。

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

    【讨论】:

      【解决方案2】:

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

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

      2. 任何不终止语句且不属于情况 3 或 4 的换行符:tokenize.NL

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

      【讨论】:

        【解决方案3】:

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

        注意a,之后的1,13-1,14: NL '\n'


        NEWLINE 和 NL 之间的区别基本上是 NL 是在不“完整”的行之后生成的:

        def a_func(a, b):
        

        导致 NEWLINE 因为整个逻辑行在 1 个物理行上

        def another_func(a,
                         b)
        

        导致 NL,因为 1 个逻辑行的代码分布在 2 个物理行上

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-13
          • 1970-01-01
          • 1970-01-01
          • 2020-03-23
          • 2016-10-30
          相关资源
          最近更新 更多