/opt/imh-python/lib/python3.9/site-packages
NameSizeModeActions
amqp/-0755rm
amqp-5.3.1.dist-info/-0755rm
apache_libcloud-3.1.0.dist-info/-0755rm
appdirs-1.4.4.dist-info/-0755rm
apscheduler/-0755rm
APScheduler-3.11.0.dist-info/-0755rm
arrow/-0755rm
arrow-1.2.3.dist-info/-0755rm
astroid/-0755rm
astroid-3.3.9.dist-info/-0755rm
asttokens/-0755rm
asttokens-3.0.0.dist-info/-0755rm
attr/-0755rm
attrs/-0755rm
attrs-25.3.0.dist-info/-0755rm
autocommand/-0755rm
autocommand-2.2.2.dist-info/-0755rm
automat/-0755rm
automat-25.4.16.dist-info/-0755rm
backports/-0755rm
backports.tarfile-1.2.0.dist-info/-0755rm
bakauth/-0755rm
bakauth-1.6.2.dist-info/-0755rm
bcrypt/-0755rm
bcrypt-3.2.2.dist-info/-0755rm
billiard/-0755rm
billiard-4.2.1.dist-info/-0755rm
blessings/-0755rm
blessings-1.7.dist-info/-0755rm
boto3/-0755rm
boto3-1.16.63.dist-info/-0755rm
botocore/-0755rm
botocore-1.19.63.dist-info/-0755rm
celery/-0755rm
celery-5.4.0.dist-info/-0755rm
certifi/-0755rm
certifi-2025.4.26.dist-info/-0755rm
cffi/-0755rm
cffi-1.17.1.dist-info/-0755rm
chardet/-0755rm
chardet-3.0.4.dist-info/-0755rm
cheroot/-0755rm
cheroot-10.0.1.dist-info/-0755rm
cherrypy/-0755rm
CherryPy-18.6.1.dist-info/-0755rm
cinderclient/-0755rm
click/-0755rm
click-8.1.8.dist-info/-0755rm
click_didyoumean/-0755rm
click_didyoumean-0.3.1.dist-info/-0755rm
click_plugins/-0755rm
click_plugins-1.1.1.dist-info/-0755rm
click_repl/-0755rm
click_repl-0.3.0.dist-info/-0755rm
constantly/-0755rm
constantly-23.10.4.dist-info/-0755rm
construct/-0755rm
construct-2.10.70.dist-info/-0755rm
cpapis/-0755rm
cpapis-1.0.dist-info/-0755rm
cproc/-0755rm
cproc-1.0.dist-info/-0755rm
croniter/-0755rm
croniter-2.0.1.dist-info/-0755rm
crossplane/-0755rm
crossplane-0.5.8.dist-info/-0755rm
Crypto/-0755rm
Cryptodome/-0755rm
cryptography/-0755rm
cryptography-36.0.2.dist-info/-0755rm
cwp/-0755rm
cwp-0.1.2.dist-info/-0755rm
dateutil/-0755rm
debtcollector/-0755rm
debtcollector-3.0.0.dist-info/-0755rm
decorator-5.2.1.dist-info/-0755rm
dill/-0755rm
dill-0.4.0.dist-info/-0755rm
distro/-0755rm
distro-1.9.0.dist-info/-0755rm
dns/-0755rm
dnspython-2.7.0.dist-info/-0755rm
dogpile/-0755rm
dogpile_cache-1.4.0.dist-info/-0755rm
exceptiongroup/-0755rm
exceptiongroup-1.2.2.dist-info/-0755rm
executing/-0755rm
executing-2.2.0.dist-info/-0755rm
fabric/-0755rm
fab_classic-1.19.1.dist-info/-0755rm
flask/-0755rm
Flask-1.1.2.dist-info/-0755rm
flask_apscheduler/-0755rm
Flask_APScheduler-1.11.0.dist-info/-0755rm
flask_redis/-0755rm
flask_redis-0.4.0.dist-info/-0755rm
flask_sqlalchemy/-0755rm
Flask_SQLAlchemy-2.4.4.dist-info/-0755rm
future/-0755rm
future-1.0.0.dist-info/-0755rm
gunicorn/-0755rm
gunicorn-20.0.4.dist-info/-0755rm
hyperlink/-0755rm
hyperlink-21.0.0.dist-info/-0755rm
idna/-0755rm
idna-2.10.dist-info/-0755rm
importlib_metadata/-0755rm
importlib_metadata-4.13.0.dist-info/-0755rm
incremental/-0755rm
incremental-22.10.0.dist-info/-0755rm
influxdb/-0755rm
influxdb-5.3.2.dist-info/-0755rm
IPython/-0755rm
ipython-8.18.1.dist-info/-0755rm
iso8601/-0755rm
iso8601-2.1.0.dist-info/-0755rm
isort/-0755rm
isort-6.0.1.dist-info/-0755rm
itsdangerous/-0755rm
itsdangerous-1.1.0.dist-info/-0755rm
jaraco/-0755rm
jaraco.collections-5.1.0.dist-info/-0755rm
jaraco.context-6.0.1.dist-info/-0755rm
jaraco.functools-4.1.0.dist-info/-0755rm
jaraco.text-4.0.0.dist-info/-0755rm
jedi/-0755rm
jedi-0.19.2.dist-info/-0755rm
jinja2/-0755rm
Jinja2-2.11.3.dist-info/-0755rm
jmespath/-0755rm
jmespath-0.10.0.dist-info/-0755rm
jsonpatch-1.33.dist-info/-0755rm
jsonpointer-3.0.0.dist-info/-0755rm
keystoneauth1/-0755rm
keystoneauth1-5.10.0.dist-info/-0755rm
kombu/-0755rm
kombu-5.5.3.dist-info/-0755rm
ldap/-0755rm
libcloud/-0755rm
libfuturize/-0755rm
libpasteurize/-0755rm
markupsafe/-0755rm
MarkupSafe-1.1.1.dist-info/-0755rm
matplotlib_inline/-0755rm
matplotlib_inline-0.1.7.dist-info/-0755rm
mccabe-0.7.0.dist-info/-0755rm
mdstat/-0755rm
mdstat-1.0.4.dist-info/-0755rm
meld3/-0755rm
meld3-2.0.1.dist-info/-0755rm
more_itertools/-0755rm
more_itertools-10.7.0.dist-info/-0755rm
msgpack/-0755rm
msgpack-0.6.1.dist-info/-0755rm
mtrlib/-0755rm
mtrlib-1.2.0.dist-info/-0755rm
munch/-0755rm
munch-4.0.0.dist-info/-0755rm
nacl/-0755rm
netaddr/-0755rm
netaddr-0.8.0.dist-info/-0755rm
netifaces-0.10.9.dist-info/-0755rm
netmiko/-0755rm
netmiko-3.4.0.dist-info/-0755rm
ntc_templates/-0755rm
ntc_templates-7.8.0.dist-info/-0755rm
numpy/-0755rm
numpy-1.26.0.dist-info/-0755rm
numpy.libs/-0755rm
OpenSSL/-0755rm
openstack/-0755rm
openstacksdk-0.49.0.dist-info/-0755rm
oslo.i18n-6.5.1.dist-info/-0755rm
oslo.utils-7.1.0.dist-info/-0755rm
oslo_i18n/-0755rm
oslo_utils/-0755rm
os_client_config/-0755rm
os_client_config-2.1.0.dist-info/-0755rm
os_service_types/-0755rm
os_service_types-1.7.0.dist-info/-0755rm
packaging/-0755rm
packaging-25.0.dist-info/-0755rm
paramiko/-0755rm
paramiko-3.5.1.dist-info/-0755rm
parso/-0755rm
parso-0.8.4.dist-info/-0755rm
past/-0755rm
pbr/-0755rm
pbr-6.1.1.dist-info/-0755rm
pem/-0755rm
pem-20.1.0.dist-info/-0755rm
pexpect/-0755rm
pexpect-4.9.0.dist-info/-0755rm
picotui/-0755rm
picotui-1.2.dist-info/-0755rm
pip/-0755rm
pip-25.1.1.dist-info/-0755rm
pkg_resources/-0755rm
platformdirs/-0755rm
platformdirs-4.3.7.dist-info/-0755rm
portend-3.2.0.dist-info/-0755rm
pp_api/-0755rm
pp_api-1.3.1.dist-info/-0755rm
pr2modules/-0755rm
prettytable-0.7.2.dist-info/-0755rm
prometheus_client/-0755rm
prometheus_client-0.14.1.dist-info/-0755rm
prompt_toolkit/-0755rm
prompt_toolkit-3.0.51.dist-info/-0755rm
psutil/-0755rm
psutil-5.7.3.dist-info/-0755rm
psycopg2/-0755rm
psycopg2-2.8.6.dist-info/-0755rm
ptyprocess/-0755rm
ptyprocess-0.7.0.dist-info/-0755rm
pure_eval/-0755rm
pure_eval-0.2.3.dist-info/-0755rm
pyasn1/-0755rm
pyasn1-0.6.1.dist-info/-0755rm
pyasn1_modules/-0755rm
pyasn1_modules-0.4.2.dist-info/-0755rm
pycparser/-0755rm
pycparser-2.22.dist-info/-0755rm
pycryptodome-3.9.9.dist-info/-0755rm
pycryptodomex-3.9.9.dist-info/-0755rm
pyeapi/-0755rm
pyeapi-0.8.4.dist-info/-0755rm
pygit2/-0755rm
pygit2-1.6.1.dist-info/-0755rm
pygit2.libs/-0755rm
pygments/-0755rm
pygments-2.19.1.dist-info/-0755rm
pygraph/-0755rm
PyGraph-0.3.0.dist-info/-0755rm
pyipmi/-0755rm
pylint/-0755rm
pylint-3.3.7.dist-info/-0755rm
pymysql/-0755rm
PyMySQL-1.0.3.dist-info/-0755rm
PyNaCl-1.5.0.dist-info/-0755rm
pynetbox/-0755rm
pynetbox-6.5.0.dist-info/-0755rm
pyOpenSSL-19.1.0.dist-info/-0755rm
pyparsing/-0755rm
pyparsing-3.2.3.dist-info/-0755rm
pyroute2/-0755rm
pyroute2-0.7.12.dist-info/-0755rm
pyserial-3.5.dist-info/-0755rm
pysparklines-1.4.dist-info/-0755rm
python_cinderclient-7.1.0.dist-info/-0755rm
python_crontab-2.7.1.dist-info/-0755rm
python_dateutil-2.9.0.post0.dist-info/-0755rm
python_ipmi-0.5.7.dist-info/-0755rm
python_ldap-3.3.1.dist-info/-0755rm
python_whois-0.7.3.dist-info/-0755rm
pytz/-0755rm
pytz-2025.2.dist-info/-0755rm
pyudev/-0755rm
pyudev-0.23.2.dist-info/-0755rm
PyYAML-5.4.1.dist-info/-0755rm
pyzmq-19.0.2.dist-info/-0755rm
pyzmq.libs/-0755rm
rads/-0755rm
rads-4.1.0.dist-info/-0755rm
redis/-0755rm
redis-3.5.3.dist-info/-0755rm
requests/-0755rm
requests-2.24.0.dist-info/-0755rm
requestsexceptions/-0755rm
requestsexceptions-1.4.0.dist-info/-0755rm
restic/-0755rm
restic-1.3.5.dist-info/-0755rm
s3transfer/-0755rm
s3transfer-0.3.7.dist-info/-0755rm
scp-0.15.0.dist-info/-0755rm
serial/-0755rm
service_identity/-0755rm
service_identity-23.1.0.dist-info/-0755rm
setproctitle-1.1.10.dist-info/-0755rm
setuptools/-0755rm
setuptools-57.0.0.dist-info/-0755rm
simplejson/-0755rm
simplejson-3.20.1.dist-info/-0755rm
six-1.17.0.dist-info/-0755rm
slapdtest/-0755rm
sparkline/-0755rm
sqlalchemy/-0755rm
SQLAlchemy-1.3.24.dist-info/-0755rm
stack_data/-0755rm
stack_data-0.6.3.dist-info/-0755rm
stevedore/-0755rm
stevedore-5.4.1.dist-info/-0755rm
tabulate-0.8.10.dist-info/-0755rm
tailer/-0755rm
tailer-0.4.1.dist-info/-0755rm
tempora/-0755rm
tempora-5.8.0.dist-info/-0755rm
tenacity/-0755rm
tenacity-9.1.2.dist-info/-0755rm
test/-0755rm
testdata/-0755rm
tests/-0755rm
textfsm/-0755rm
textfsm-1.1.3.dist-info/-0755rm
toml/-0755rm
toml-0.10.2.dist-info/-0755rm
tomli/-0755rm
tomli-2.2.1.dist-info/-0755rm
tomlkit/-0755rm
tomlkit-0.13.2.dist-info/-0755rm
tornado/-0755rm
tornado-6.0.4.dist-info/-0755rm
traitlets/-0755rm
traitlets-5.14.3.dist-info/-0755rm
twisted/-0755rm
Twisted-22.4.0.dist-info/-0755rm
typing_extensions-4.13.2.dist-info/-0755rm
tzdata/-0755rm
tzdata-2025.2.dist-info/-0755rm
tzlocal/-0755rm
tzlocal-5.3.1.dist-info/-0755rm
untangle-1.1.1.dist-info/-0755rm
urllib3/-0755rm
urllib3-1.25.11.dist-info/-0755rm
uWSGI-2.0.19.1.dist-info/-0755rm
version_utils/-0755rm
version_utils-0.3.2.dist-info/-0755rm
vine/-0755rm
vine-5.1.0.dist-info/-0755rm
wcwidth/-0755rm
wcwidth-0.2.13.dist-info/-0755rm
werkzeug/-0755rm
Werkzeug-2.0.3.dist-info/-0755rm
wheel/-0755rm
wheel-0.45.1.dist-info/-0755rm
whois/-0755rm
wrapt/-0755rm
wrapt-1.17.2.dist-info/-0755rm
yaml/-0755rm
zc/-0755rm
zc.lockfile-3.0.post1.dist-info/-0755rm
zipp/-0755rm
zipp-3.21.0.dist-info/-0755rm
zmq/-0755rm
zope/-0755rm
zope.interface-7.2.dist-info/-0755rm
_distutils_hack/-0755rm
_yaml/-0755rm
__pycache__/-0755rm
appdirs.py247200644editdlrm
cronlog.py37730644editdlrm
crontab.py468620644editdlrm
crontabs.py44380644editdlrm
decorator.py170670644editdlrm
distutils-precedence.pth1520644editdlrm
jsonpatch.py297780644editdlrm
jsonpointer.py106010644editdlrm
ldapurl.py125250644editdlrm
ldif.py202780644editdlrm
LICENSE6010644editdlrm
mccabe.py106540644editdlrm
netifaces.cpython-39-x86_64-linux-gnu.so245840755editdlrm
portend.py64880644editdlrm
prettytable.py542040644editdlrm
README.md31800644editdlrm
README.txt1190644editdlrm
scp.py223930644editdlrm
setproctitle.cpython-39-x86_64-linux-gnu.so239520755editdlrm
six.py347030644editdlrm
tabulate.py738890644editdlrm
typing_extensions.py1726540644editdlrm
untangle.py55350644editdlrm
uwsgidecorators.py103920644editdlrm
zc.lockfile-3.0.post1-py3.9-nspkg.pth5190644editdlrm
zope.interface-7.2-py3.9-nspkg.pth4570644editdlrm
_cffi_backend.cpython-39-x86_64-linux-gnu.so2740960755editdlrm
_ldap.cpython-39-x86_64-linux-gnu.so956320755editdlrm
Edit: /opt/imh-python/lib/python3.9/site-packages/jsonpointer.py (10601B)
# -*- coding: utf-8 -*- # # python-json-pointer - An implementation of the JSON Pointer syntax # https://github.com/stefankoegl/python-json-pointer # # Copyright (c) 2011 Stefan Kögl # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # """ Identify specific nodes in a JSON document (RFC 6901) """ # Will be parsed by setup.py to determine package metadata __author__ = 'Stefan Kögl ' __version__ = '3.0.0' __website__ = 'https://github.com/stefankoegl/python-json-pointer' __license__ = 'Modified BSD License' import copy import re from collections.abc import Mapping, Sequence from itertools import tee, chain _nothing = object() def set_pointer(doc, pointer, value, inplace=True): """Resolves a pointer against doc and sets the value of the target within doc. With inplace set to true, doc is modified as long as pointer is not the root. >>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}} >>> set_pointer(obj, '/foo/anArray/0/prop', 55) == \ {'foo': {'another prop': {'baz': 'A string'}, 'anArray': [{'prop': 55}]}} True >>> set_pointer(obj, '/foo/yet another prop', 'added prop') == \ {'foo': {'another prop': {'baz': 'A string'}, 'yet another prop': 'added prop', 'anArray': [{'prop': 55}]}} True >>> obj = {'foo': {}} >>> set_pointer(obj, '/foo/a%20b', 'x') == \ {'foo': {'a%20b': 'x' }} True """ pointer = JsonPointer(pointer) return pointer.set(doc, value, inplace) def resolve_pointer(doc, pointer, default=_nothing): """ Resolves pointer against doc and returns the referenced object >>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}, 'a%20b': 1, 'c d': 2} >>> resolve_pointer(obj, '') == obj True >>> resolve_pointer(obj, '/foo') == obj['foo'] True >>> resolve_pointer(obj, '/foo/another prop') == obj['foo']['another prop'] True >>> resolve_pointer(obj, '/foo/another prop/baz') == obj['foo']['another prop']['baz'] True >>> resolve_pointer(obj, '/foo/anArray/0') == obj['foo']['anArray'][0] True >>> resolve_pointer(obj, '/some/path', None) == None True >>> resolve_pointer(obj, '/a b', None) == None True >>> resolve_pointer(obj, '/a%20b') == 1 True >>> resolve_pointer(obj, '/c d') == 2 True >>> resolve_pointer(obj, '/c%20d', None) == None True """ pointer = JsonPointer(pointer) return pointer.resolve(doc, default) def pairwise(iterable): """ Transforms a list to a list of tuples of adjacent items s -> (s0,s1), (s1,s2), (s2, s3), ... >>> list(pairwise([])) [] >>> list(pairwise([1])) [] >>> list(pairwise([1, 2, 3, 4])) [(1, 2), (2, 3), (3, 4)] """ a, b = tee(iterable) for _ in b: break return zip(a, b) class JsonPointerException(Exception): pass class EndOfList(object): """Result of accessing element "-" of a list""" def __init__(self, list_): self.list_ = list_ def __repr__(self): return '{cls}({lst})'.format(cls=self.__class__.__name__, lst=repr(self.list_)) class JsonPointer(object): """A JSON Pointer that can reference parts of a JSON document""" # Array indices must not contain: # leading zeros, signs, spaces, decimals, etc _RE_ARRAY_INDEX = re.compile('0|[1-9][0-9]*$') _RE_INVALID_ESCAPE = re.compile('(~[^01]|~$)') def __init__(self, pointer): # validate escapes invalid_escape = self._RE_INVALID_ESCAPE.search(pointer) if invalid_escape: raise JsonPointerException('Found invalid escape {}'.format( invalid_escape.group())) parts = pointer.split('/') if parts.pop(0) != '': raise JsonPointerException('Location must start with /') parts = [unescape(part) for part in parts] self.parts = parts def to_last(self, doc): """Resolves ptr until the last step, returns (sub-doc, last-step)""" if not self.parts: return doc, None for part in self.parts[:-1]: doc = self.walk(doc, part) return doc, JsonPointer.get_part(doc, self.parts[-1]) def resolve(self, doc, default=_nothing): """Resolves the pointer against doc and returns the referenced object""" for part in self.parts: try: doc = self.walk(doc, part) except JsonPointerException: if default is _nothing: raise else: return default return doc get = resolve def set(self, doc, value, inplace=True): """Resolve the pointer against the doc and replace the target with value.""" if len(self.parts) == 0: if inplace: raise JsonPointerException('Cannot set root in place') return value if not inplace: doc = copy.deepcopy(doc) (parent, part) = self.to_last(doc) if isinstance(parent, Sequence) and part == '-': parent.append(value) else: parent[part] = value return doc @classmethod def get_part(cls, doc, part): """Returns the next step in the correct type""" if isinstance(doc, Mapping): return part elif isinstance(doc, Sequence): if part == '-': return part if not JsonPointer._RE_ARRAY_INDEX.match(str(part)): raise JsonPointerException("'%s' is not a valid sequence index" % part) return int(part) elif hasattr(doc, '__getitem__'): # Allow indexing via ducktyping # if the target has defined __getitem__ return part else: raise JsonPointerException("Document '%s' does not support indexing, " "must be mapping/sequence or support __getitem__" % type(doc)) def get_parts(self): """Returns the list of the parts. For example, JsonPointer('/a/b').get_parts() == ['a', 'b']""" return self.parts def walk(self, doc, part): """ Walks one step in doc and returns the referenced part """ part = JsonPointer.get_part(doc, part) assert hasattr(doc, '__getitem__'), "invalid document type %s" % (type(doc),) if isinstance(doc, Sequence): if part == '-': return EndOfList(doc) try: return doc[part] except IndexError: raise JsonPointerException("index '%s' is out of bounds" % (part,)) # Else the object is a mapping or supports __getitem__(so assume custom indexing) try: return doc[part] except KeyError: raise JsonPointerException("member '%s' not found in %s" % (part, doc)) def contains(self, ptr): """ Returns True if self contains the given ptr """ return self.parts[:len(ptr.parts)] == ptr.parts def __contains__(self, item): """ Returns True if self contains the given ptr """ return self.contains(item) def join(self, suffix): """ Returns a new JsonPointer with the given suffix append to this ptr """ if isinstance(suffix, JsonPointer): suffix_parts = suffix.parts elif isinstance(suffix, str): suffix_parts = JsonPointer(suffix).parts else: suffix_parts = suffix try: return JsonPointer.from_parts(chain(self.parts, suffix_parts)) except: # noqa E722 raise JsonPointerException("Invalid suffix") def __truediv__(self, suffix): # Python 3 return self.join(suffix) @property def path(self): """Returns the string representation of the pointer >>> ptr = JsonPointer('/~0/0/~1').path == '/~0/0/~1' """ parts = [escape(part) for part in self.parts] return ''.join('/' + part for part in parts) def __eq__(self, other): """Compares a pointer to another object Pointers can be compared by comparing their strings (or splitted strings), because no two different parts can point to the same structure in an object (eg no different number representations) """ if not isinstance(other, JsonPointer): return False return self.parts == other.parts def __hash__(self): return hash(tuple(self.parts)) def __str__(self): return self.path def __repr__(self): return type(self).__name__ + "(" + repr(self.path) + ")" @classmethod def from_parts(cls, parts): """Constructs a JsonPointer from a list of (unescaped) paths >>> JsonPointer.from_parts(['a', '~', '/', 0]).path == '/a/~0/~1/0' True """ parts = [escape(str(part)) for part in parts] ptr = cls(''.join('/' + part for part in parts)) return ptr def escape(s): return s.replace('~', '~0').replace('/', '~1') def unescape(s): return s.replace('~1', '/').replace('~0', '~')