This resolves an issue where:

>>> import pyxs
>>> xsc = pyxs.Client(xen_bus_path="/proc/xen/xenbus")
>>> xsc.mkdir("/some/path")
>>> xsc.set_permissions("/some/path", 'r0')

would raise:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/.local/lib/python2.7/site-packages/pyxs-0.3-py2.7.egg/pyxs/client.py", line 227, in set_permissions
    self.ack(Op.SET_PERMS, path, *perms)
  File "/root/.local/lib/python2.7/site-packages/pyxs-0.3-py2.7.egg/pyxs/client.py", line 154, in ack
    if self.execute_command(*args) != "OK":
  File "/root/.local/lib/python2.7/site-packages/pyxs-0.3-py2.7.egg/pyxs/client.py", line 116, in execute_command
    if not self.COMMAND_VALIDATORS.get(op, lambda *args: True)(*args):
  File "/root/.local/lib/python2.7/site-packages/pyxs-0.3-py2.7.egg/pyxs/client.py", line 68, in <lambda>
    lambda p, *perms: validate_path(p) and validate_perms(perms)),
  File "/root/.local/lib/python2.7/site-packages/pyxs-0.3-py2.7.egg/pyxs/helpers.py", line 154, in validate_perms
    raise InvalidPermission(perm)
pyxs.exceptions.InvalidPermission: r

With this change:
>>> xsc.set_permissions("/some/path", 'r0', 'w0')

works correctly and verifying the results with xenstore-ls -p shows:
some  = "" . . . . . . . . . . . . . . . . . . . . . . . .  (n0)
 path = "" . . . . . . . . . . . . . . . . . . . . . . . .  (r0,w0)