首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >断言在Python中失败

断言在Python中失败
EN

Stack Overflow用户
提问于 2013-01-26 00:00:35
回答 2查看 963关注 0票数 1

我有这样的代码:

代码语言:javascript
复制
/server/frontend/wsn.py
Line 866:        
    netid = hextransform(int(nid), 16)

Line 156: 
    def hextransform(data, length):
        data = hex(data)[2:]
        assert(len(data) <= length)
        # zero-padding
        data = ('0' * (length - len(data))) + data
        # Swap 'bytes' in the network ID
        data = list(data)
        for i in range(0, length, 2):
            tmp = data[i]
            data[i] = data[i + 1]
            data[i + 1] = tmp
        # Reverse the whole string (TODO: CHECK) 
        data.reverse()
        #data = "".join(data)
        return data

例如,我的问题是当我有一个nid = 15579202759033880576的时候。是不是太长了?

我从Tornado收到的错误是:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/tornado/web.py", line 988, in _execute
    getattr(self, self.request.method.lower())(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/tornado/web.py", line 1739, in wrapper
    return method(self, *args, **kwargs)
  File "./wsn.py", line 866, in get
    netid = hextransform(int(nid), 16)
  File "./wsn.py", line 158, in hextransform
    assert(len(data) <= length)
AssertionError

但是十六进制中的netid0xd834725e00000000len(nid) = 16

我不知道问题出在哪里。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-26 00:17:12

hex(int(num))中的“L”就是你的问题:

代码语言:javascript
复制
>>> hex(int(15579202759033880576))[2:]
'd834725e00000000L'   <-- 17 with the L

解决这个问题最快的方法就是更新子字符串,去掉那个L:

代码语言:javascript
复制
data = hex(data)[2:].split('L')[0]

这将拆分你的字符串围绕L(如果存在),并给你十六进制部分。它是安全的,因为'L‘不是十六进制字符,所以只有当你有一个长字符串时,它才会显示出来。

票数 1
EN

Stack Overflow用户

发布于 2013-01-26 00:08:28

Python为长数字添加了一个L

代码语言:javascript
复制
>>> hex(int(15579202759033880576))
'0xd834725e00000000L'

再添加一个字符。使用不同的方法创建十六进制数字:

代码语言:javascript
复制
format(data, '016x')

而不是。format() function允许您使用format spec mini language来转换数据;在这种情况下,x是一种大小写较小的十六进制表示,您不需要对任何内容进行切片:

代码语言:javascript
复制
>>> format(15579202759033880576, '016x')
'd834725e00000000'

请注意格式中的016;如果您的数字小于16位十六进制数字,它将为您填充零:

代码语言:javascript
复制
>>> format(1557920, '016x')
'000000000017c5a0'

字节交换也可以更容易地完成;python支持多个赋值,允许您交换两个值,而不需要临时变量:

代码语言:javascript
复制
for i in range(0, length, 2):
    data[i], data[i + 1] = data[i + 1], data[i]

因此,您的hextransform方法可以简化为:

代码语言:javascript
复制
def hextransform(data, length):
    data = format(data, '0{0}x'.format(length))
    assert(len(data) == length), '{0!r}, {1}'.format(data, length)
    # Swap 'bytes' in the network ID
    data = list(data)
    for i in range(0, length, 2):
        data[i], data[i + 1] = data[i + 1], data[i]
    data.reverse()
    return data

结果是:

代码语言:javascript
复制
>>> hextransform(15579202759033880576, 16)
['0', '0', '0', '0', '0', '0', '0', '0', '5', 'e', '7', '2', '3', '4', 'd', '8']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14525478

复制
相关文章

相似问题

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