我正在尝试将大字符串F分区为m个块,如下所示:
import random
from largeprimes import generateRandom
def generateRandom(length):
t = random.randint(0, 2**length)
str = "{0:b}".format(t)
if (len(str) < length):
str.zfill(length)
return str
def divide_file_block (): #return bi: int
b = []
for i in range (0, m):
b_i = F[(i*blocklen) : ((i+1)* blocklen)]
temp = int(b_i, 2) % q
b.append(temp)
return b
F = generateRandom(102400)
m = 100
blocklen = len(F)/m
q = generateLargePrime(1024) # generateLargePrime is from https://langui.sh/2009/03/07/generating-very-large-primes/
print divide_file_block ()
注意:您应将代码从1复制到当前目录,删除那里的最后一个print
语句并将其命名为largpeprimes.py
。这使得generateLargePrime
函数可导入。
当我测试一个小例子时,它打印出正确的结果。但是当我测试b_i和q为1024位时,它打印出错误:
temp = int(b_i, 2) % q
TypeError: unsupported operand type(s) for %: 'int' and 'str'
你能解释一下为什么,并给我一个建议,以显示这个问题。提前谢谢。
答案 0 :(得分:2)
generateLargePrime
有时会返回字符串尝试代码我遇到了同样的问题。
在调试器中测试我得到了原因:q
的值为“1100.0尝试后失败”。
这绝对是导致失败的字符串。
我建议修改generateLargePrime
代码以抛出异常,而不是通过返回值报告失败。
这是最简单(也可能是最受欢迎)的快速解决方案。
类似
b_i = F[(i*blocklen) : ((i+1)* blocklen)]
print "q", q # here is all the magic
temp = int(b_i, 2) % q
会告诉你价值
assert
放入您的代码b_i = F[(i*blocklen) : ((i+1)* blocklen)]
assert isinstance(q, int)
temp = int(b_i, 2) % q
只要q
不是int
类型,就会抛出异常
pdb
附带Python,我更喜欢IPython附带的ipdb
,两者都可以帮到你。
尝试通过Python解释器
运行它$ python failingscript.py
因为它失败了,你只需再试一次,而不是python
使用pdb
或ipdb
$ ipdb failingscript.py
使用调试器可以控制逐行运行代码。通常我让它由“c”(继续)命令运行,它很快就会在问题点崩溃。然后我使用“l”(列表)来查看我们所处的代码行,最后使用“p”(print)命令来打印出现问题的变量值。这样我用“p q”发现它是一个字符串。
需要一点时间来学习pdb
或ipdb
,但它可以作为涡轮解析器使用,因此它绝对是学习的技能。很棒的教程是PMotW