2016-04-15 20 views
0

Ich arbeite durch http://blog.thedigitalcatonline.com/blog/2015/05/13/python-oop-tdd-example-part1/#.VxEEfjE2sdQ. Ich arbeite das iterativ durch. An diesem Punkt habe ich folgendes Binary Klasse:TypeError: int() Argument muss eine Zeichenfolge oder eine Zahl sein, nicht 'Binär'

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 

ich durch eine Reihe von Tests renne pytest verwenden, einschließlich:

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' 

Ich verstehe nicht, diesen Fehler. Was mache ich falsch?

edit: here die Klasse von dem Blog-Autor produziert:

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 

Antwort

3

Die int Funktion kann nicht mit benutzerdefinierten Klassen handeln, wenn Sie in der Klasse angeben, wie es sollte funktionieren. Die __int__ (nicht init) -Funktion gibt die integrierte Python int() Funktionsinformationen darüber, wie Ihre benutzerdefinierte Klasse (in diesem Fall Binary) in eine int konvertiert werden soll.

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

Dann sollten Sie Dinge wie tun können.

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

ich auch könnte darauf hindeuten, den Eingang für die __init__ Funktion und den Wert des self.value zu standardisieren. Gegenwärtig kann es entweder eine Zeichenkette (z. B. '0b011' oder 0x3) oder eine int. Akzeptieren. Warum nicht einfach immer eine Zeichenkette als Eingabe akzeptieren und immer self.value als int behalten.

+0

Hallo Garrett, danke für die Antwort. Ich bin ein Anfänger, tut mir leid, dass ich nicht verstanden habe. Ich habe https://docs.python.org/2/library/functions.html#int gelesen. 1. In Bezug auf "Die int-Funktion kann nicht mit benutzerdefinierten Klassen umgehen, wenn Sie nicht in der Klasse angeben, wie es funktionieren soll." Die Klasse, die vom Blogautor entwickelt wurde, tut dies nicht, es sei denn, ich missverstehe (siehe oben Bearbeiten). 2. bezüglich "Warum nicht einfach immer eine Zeichenfolge als Eingabe akzeptieren" - Wie machst du das? – user61629

+0

Überprüfen Sie die Änderungen. –

+0

Hallo, Danke für deine Hilfe. 2 Fragen: 1) ist die '__int__'-Funktion der Binär-Klasse, die das eingebaute int() 2. bezüglich "Warum man nicht immer nur eine Zeichenkette als Eingabe akzeptieren lässt" - Wie macht man das? – user61629

Verwandte Themen