首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标记化模块的奇怪行为

标记化模块的奇怪行为
EN

Stack Overflow用户
提问于 2014-07-10 23:16:11
回答 1查看 60关注 0票数 0

在使用tokenize模块时,我看到了一些奇怪的行为

代码语言:javascript
复制
import tokenize, io, sys
from contextlib import closing
source=u"""
for i in range(10):
    print "HELLO"
    if i==5:
        print "bingo"
"""
def parse():
    with closing(io.StringIO(source)) as f:
        for type, token, (srow, scol), (erow, ecol), line in tokenize.generate_tokens(f.readline):
            print("%d,%d-%d,%d:\t%s\t%s" % (srow, scol, erow, ecol, tokenize.tok_name[type], repr(token)))
            yield type, token, (srow, scol), (erow, ecol), line

for token in tokenize.untokenize(parse()):
    sys.stdout.write(token)

控制台的输出中缺少if之前的缩进。在python2和3中都会发生这种情况。这是一个已知的错误,还是我错误地使用了这个模块?

代码语言:javascript
复制
3,1-3,6:    NAME    u'print'
3,7-3,14:   STRING  u'"HELLO"'
3,14-3,15:  NEWLINE u'\n'
4,1-4,3:    NAME    u'if'
4,4-4,5:    NAME    u'i'
4,5-4,7:    OP  u'=='

我使用制表符来缩进。当我将制表符替换为4个空格时,我得到了正确的结果

代码语言:javascript
复制
3,4-3,9:    NAME    u'print'
3,10-3,17:  STRING  u'"HELLO"'
3,17-3,18:  NEWLINE u'\n'
4,4-4,6:    NAME    u'if'
4,7-4,8:    NAME    u'i'
4,8-4,10:   OP  u'=='
4,10-4,11:  NUMBER  u'5'
4,11-4,12:  OP  u':'

不同之处在于if的起始列,使用制表符时为1,使用空格时为4。这似乎是“untokenize”函数中的一个错误,该函数似乎输出空格而不是制表符。

有人能确认一下吗?

EN

回答 1

Stack Overflow用户

发布于 2014-07-11 00:15:34

每件事都完全是它应该的样子。列索引是从0开始的。一个tab是一个字符,因此在第1列中正确检测到了if。当您将此tab更改为4 spaces时,实际上有4个字符,因此在第4列中检测到了if

来自代码输出的证明:

代码语言:javascript
复制
1,0-1,1:    NL  u'\n'
2,0-2,3:    NAME    u'for'

如您所见,第一行中的linefeed和第二行中的for都在第0列中。

您可能会感到困惑,因为行号是从1开始的。

脚注:您应该使用空格进行缩进。这是一种约定,可以确保在另一台开发人员的机器上显示一致的缩进。显示的制表符宽度可以调整,空格宽度只有一个字符。

编辑:

在OP的评论认为tokenizeuntokenize存在问题之后,我必须添加以下说明。

作为official documentation says

结果将保证返回标记化以匹配输入,因此转换是无损的,并确保往返。由于令牌之间的间距(列位置)可能发生变化,因此保证仅适用于令牌类型和令牌字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24680256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档