TypeError:int()参数必须是字符串或数字,而不是'二进制'

时间:2016-04-15 16:44:21

标签: python pytest

我正在通过{{3}}工作。我正在迭代地完成这个工作。此时我有以下二进制类:

class Binary:
    def __init__(self,value):
        self.value = str(value)
        if self.value[:2] == '0b':
            print('a binary!')
            self.value= int(self.value, base=2)
        elif self.value[:2] == '0x':
            print('a hex!')
            self.value= int(self.value, base=5)
        else:
            print(self.value)
        return None

我正在使用pytest运行一系列测试,包括:

    def test_binary_init_hex():
        binary = Binary(0x6)
        assert int(binary) == 6
      E TypeError: int() argument must be a string or a number, not 'Binary'

    def test_binary_init_binstr():
        binary = Binary('0b110')
        assert int(binary) == 6
     E  TypeError: int() argument must be a string or a number, not 'Binary'

我不明白这个错误。我做错了什么?

编辑:继承博客作者制作的课程:

import collections

class Binary:
    def __init__(self, value=0):
        if isinstance(value, collections.Sequence):
            if len(value) > 2 and value[0:2] == '0b':
                self._value = int(value, base=2)
            elif len(value) > 2 and value[0:2] == '0x':
                self._value = int(value, base=16)
            else:
                self._value = int(''.join([str(i) for i in value]), base=2)
        else:
            try:
                self._value = int(value)
                if self._value < 0:
                    raise ValueError("Binary cannot accept negative numbers. Use SizedBinary instead")
            except ValueError:
                raise ValueError("Cannot convert value {} to Binary".format(value))

    def __int__(self):
        return self._value

1 个答案:

答案 0 :(得分:3)

int函数不能处理用户定义的类,除非您在类中指定它应该如何工作。 __int__(非初始化)函数提供了有关如何将用户定义的类(在本例中为Binary)转换为int的内置python int()函数信息。

class Binary:
    ...your init here
    def __int__(self):
        return int(self.value) #assuming self.value is of type int

然后你应该可以做类似的事情。

print int(Binary(0x3)) #should print 3

我可能还建议标准化__init__函数的输入和self.value的值。目前,它可以接受字符串(例如'0b011'0x3)或int。为什么不总是让它接受一个字符串作为输入,并始终将self.value保持为int。