[英]Assert fails in Python
我有这个代码:
/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
。 太长了吗?
我从龙卷风收到的错误是这样的:
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
但netid
以十六进制是0xd834725e00000000
和len(nid) = 16
。
我不知道问题是什么。
Python为长数字添加了一个L
:
>>> hex(int(15579202759033880576))
'0xd834725e00000000L'
再添加一个字符。 使用其他方法创建十六进制数:
format(data, '016x')
代替。 format()
函数允许您使用格式规范迷你语言来转换数据; 在这种情况下, x
是一个低层的十六进制表示,您不需要切片:
>>> format(15579202759033880576, '016x')
'd834725e00000000'
注意那里的格式为016; 如果您的号码小于16位十六进制数字,则会为您填充零:
>>> format(1557920, '016x')
'000000000017c5a0'
您的字节交换也可以更轻松地完成; python支持多个赋值,让您可以交换两个值而无需临时变量:
for i in range(0, length, 2):
data[i], data[i + 1] = data[i + 1], data[i]
因此,您的hextransform
方法可以简化为:
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
导致:
>>> hextransform(15579202759033880576, 16)
['0', '0', '0', '0', '0', '0', '0', '0', '5', 'e', '7', '2', '3', '4', 'd', '8']
hex(int(num))
的'L'是你的问题:
>>> hex(int(15579202759033880576))[2:]
'd834725e00000000L' <-- 17 with the L
对此最快的解决方法就是更新你的子串剁以消除那个L:
data = hex(data)[2:].split('L')[0]
这会将你的字符串分成L(如果存在)并给你十六进制部分。 它是安全的,因为'L'不是十六进制字符所以它只会在你有一个长字符串时出现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.