Python:将字符串转换为二进制时出现断言错误

时间:2015-01-24 13:25:19

标签: python binary ascii assert

在我的python程序中测试som基本函数时,我得到了AsertionError。这是场景:

我编写了一个函数,可以将单个字母转换为ASCII格式的二进制文件:

def ascii8Bin(letter):
    conv = ord(letter)
    return '{0:08b}'.format(conv)

接下来有一个函数使用前一个函数将单词/句子中的所有字母转换为二进制:

def transferBin(string):
    l = list(string)
    for c in l:
        print ascii8Bin(c)

现在当我尝试断言这个函数时:

def test():
    assert transferBin('w') == '01110111'
    print "You test yielded no errors"

print test()

抛出AssertionError。现在我查了二进制字母表并检查了tripple:二进制文件中的w肯定是01110111.我尝试只调用transferBin('w'),它就像它应该的那样产生了01110111。

我真的对断言失败的原因感兴趣。非常感谢任何见解。

2 个答案:

答案 0 :(得分:1)

您的功能不会返回任何内容。您使用print将文本写入stdout,但您没有对此进行测试。

因此,transferBin()返回None,这是没有明确return语句的函数的默认返回值。

您必须将每个ascii8Bin()结果的结果收集到一个列表中,然后将结果合并到一个字符串中:

def transferBin(string):
    results = [ascii8Bin(c) for c in l]
    return '\n'.join(results)

这将使用换行符分隔每个字符的结果;对于你的单个字符'w'字符串,它会给你预期的字符串。

请注意,您无需将l转入列表;你可以直接迭代字符串;你会得到个性化的角色。

答案 1 :(得分:1)

您需要返回,您要与None进行比较而不是字符串。如果没有指定返回值,python将从函数返回None。

def transferBin(s):
    l = list(s)
    for c in l:
       return ascii8Bin(c) # return 

你基本上正在做assert None == '01110111',如果你只是单个字符串只是return ascii8Bin(string),你的代码中有一个return的循环会在第一个之后返回迭代,所以循环是多余的。

如果你实际上有多个字符,只需使用join,只需遍历字符串,就不需要在其上调用list来迭代字符串:

def transferBin(s):
    return "".join(ascii8Bin(ch) for ch in s)

您也可以在transferBin函数中完成所有操作:

def transferBin(s):
    return "".join('{0:08b}'.format(ord(ch)) for ch in s)