Skip to content

Commit bda5ba5

Browse files
marcharperdrvinceknight
authored andcommitted
Change EvolvablePlayer serialization to write strings instead of bytes (#1267)
* Change EvolvablePlayer serialization to write strings instead of bytes for easier inclusion in CSV files * Add serialization test
1 parent 72a5148 commit bda5ba5

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

axelrod/evolvable_player.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import base64
12
from pickle import dumps, loads
23
from random import randrange
34
from typing import Dict, List
@@ -36,12 +37,14 @@ def create_new(self, **kwargs):
3637

3738
def serialize_parameters(self):
3839
"""Serialize parameters."""
39-
return dumps(self.init_kwargs)
40+
pickled = dumps(self.init_kwargs) # bytes
41+
s = base64.b64encode(pickled).decode('utf8') # string
42+
return s
4043

4144
@classmethod
4245
def deserialize_parameters(cls, serialized):
4346
"""Deserialize parameters to a Player instance."""
44-
init_kwargs = loads(serialized)
47+
init_kwargs = loads(base64.b64decode(serialized))
4548
return cls(**init_kwargs)
4649

4750
# Optional methods for evolutionary algorithms and Moran processes.

axelrod/tests/strategies/test_evolvable_player.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,17 @@ def test_serialization(self):
140140
self.assertEqual(player, deserialized_player)
141141
self.assertEqual(deserialized_player, deserialized_player.clone())
142142

143+
def test_serialization_csv(self):
144+
"""Serializing and deserializing should return the original player."""
145+
seed(0)
146+
player = self.player()
147+
serialized = player.serialize_parameters()
148+
s = "0, 1, {}, 3".format(serialized)
149+
s2 = s.split(',')[2]
150+
deserialized_player = player.__class__.deserialize_parameters(s2)
151+
self.assertEqual(player, deserialized_player)
152+
self.assertEqual(deserialized_player, deserialized_player.clone())
153+
143154
def behavior_test(self, player1, player2):
144155
"""Test that the evolvable player plays the same as its (nonevolvable) parent class."""
145156
for opponent_class in [axl.Random, axl.TitForTat, axl.Alternator]:

0 commit comments

Comments
 (0)