__repr__ for a binary tree whose constructor has default arguments
One thing you can simplify is this subexpression:

repr(self.left) if self.left else None


to just:

repr(self.left)


since repr(None) == str(None) == 'None'. Just saves some typing.

Furthermore, when you are doing:

'({}, {}, {})'.format(repr(a), repr(b), repr(c))


that is equivalent to just repring the tuple:

repr((a, b, c))


Other than that, is it worth the added complexity of the replaces? It's not the end of the world that:

repr(BinaryTree(2)) == 'BinaryTree(2, None, None)'


I'd say just keep it simple:

return '{}{}'.format(
          self.__class__.__name__,
          repr((self.value, self.left, self.right)))