diff --git a/src/bindings/python/hammer_tests.py b/src/bindings/python/hammer_tests.py
index 3f0596c3cad9c2705119064f3103c64eddb40f0e..d1c18db1e84c04b2187262f7181db28d472851b0 100644
--- a/src/bindings/python/hammer_tests.py
+++ b/src/bindings/python/hammer_tests.py
@@ -6,7 +6,7 @@ class TestTokenParser(unittest.TestCase):
     def setUpClass(cls):
         cls.parser = h.h_token("95\xa2", 3)
     def test_success(self):
-        self.assertEqual(h.h_parse(self.parser, "95\xa2", 3).ast.token_data.bytes.token, "95\xa2")
+        self.assertEqual(h.h_parse(self.parser, "95\xa2", 3).ast.token_data.bytes, "95\xa2")
     def test_partial_fails(self):
         self.assertEqual(h.h_parse(self.parser, "95", 2), None)
 
@@ -226,7 +226,7 @@ class TestSequence(unittest.TestCase):
     def setUpClass(cls):
         cls.parser = h.h_sequence(h.h_ch("a"), h.h_ch("b"))
     def test_success(self):
-        self.assertEqual(h.h_parse(self.parser, "ab").ast.token_data.seq, ["a", "b"])
+        self.assertEqual(h.h_parse(self.parser, "ab", 2).ast.token_data.seq, ["a", "b"])
     def test_failure(self):
         self.assertEqual(h.h_parse(self.parser, "a", 1), None)
         self.assertEqual(h.h_parse(self.parser, "b", 1), None)
@@ -255,7 +255,7 @@ class TestChoice(unittest.TestCase):
 class TestButNot(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        cls.parser = h.h_butnot(h.h_ch("a"), h.h_token("ab"))
+        cls.parser = h.h_butnot(h.h_ch("a"), h.h_token("ab", 2))
     def test_success(self):
         self.assertEqual(h.h_parse(self.parser, "a", 1).ast.token_data.bytes, "a")
         self.assertEqual(h.h_parse(self.parser, "aa", 2).ast.token_data.bytes, "a")
@@ -439,7 +439,7 @@ class TestAnd3(unittest.TestCase):
 class TestNot1(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        cls.parser = h.h_sequence(h.h_ch("a"), h.h_choice(h.h_ch("+"), h.h_token("++")), h.h_ch("b"))
+        cls.parser = h.h_sequence(h.h_ch("a"), h.h_choice(h.h_ch("+"), h.h_token("++", 2)), h.h_ch("b"))
     def test_success(self):
         self.assertEqual(h.h_parse(self.parser, "a+b", 3).ast.token_data.seq, ["a", "+", "b"])
     def test_failure(self):
@@ -448,7 +448,7 @@ class TestNot1(unittest.TestCase):
 class TestNot2(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        cls.parser = h.h_sequence(h.h_ch("a"), h.h_choice(h.h_sequence(h.h_ch("+"), h.h_not(h.h_ch("+"))), h.h_token("++")), h.h_ch("b"))
+        cls.parser = h.h_sequence(h.h_ch("a"), h.h_choice(h.h_sequence(h.h_ch("+"), h.h_not(h.h_ch("+"))), h.h_token("++", 2)), h.h_ch("b"))
     def test_success(self):
         self.assertEqual(h.h_parse(self.parser, "a+b", 3).ast.token_data.seq, ["a", ["+"], "b"])
         self.assertEqual(h.h_parse(self.parser, "a++b", 4).ast.token_data.seq, ["a", "++", "b"])
diff --git a/src/bindings/swig/hammer.i b/src/bindings/swig/hammer.i
index ad61e4992ccd7ec1615004b187bff0df659b1eaa..412743ac92bbc5cd340f059ae3182554f63abced 100644
--- a/src/bindings/swig/hammer.i
+++ b/src/bindings/swig/hammer.i
@@ -11,6 +11,20 @@
 %typemap(out) uint8_t* {
   $result = PyString_FromString((char*)$1);
  }
+%typemap(in) uint8_t {
+  if (PyInt_Check($input)) {
+    $1 = PyInt_AsLong($input);
+  }
+  else if (!PyString_Check($input)) {
+    PyErr_SetString(PyExc_ValueError, "Expecting a string");
+    return NULL;
+  } else {
+    $1 = *(uint8_t*)PyString_AsString($input);
+  }
+ }
+%typemap(out) HBytes* {
+  $result = PyString_FromStringAndSize((char*)$1->token, $1->len);
+ }
 #else
   #warning no uint8_t* typemaps defined
 #endif
@@ -24,5 +38,3 @@
 %include "allocator.h"
 %include "hammer.h"
 
-
-