Skip to content

Instantly share code, notes, and snippets.

@wheaties
Created April 24, 2018 21:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wheaties/27d275d5c9ad964f05d2b73f6bb5b770 to your computer and use it in GitHub Desktop.
Save wheaties/27d275d5c9ad964f05d2b73f6bb5b770 to your computer and use it in GitHub Desktop.
Python descriptor object for representing a url parameter
class Param:
'''Python descriptor for representing a query param within a url'''
def __init__(self, default=None, name=None, required=False):
self.default = str(default)
self.name = name
self.required = required
self.values = {} # in a real impl you'd use a WeakRefDict
def __set_name__(self, owner, name):
if not self.name:
self.name = name
def __get__(self, obj, objtype=None):
if obj is None:
return self
else:
value = self.value(obj)
if value =! self.default or self.required:
return ParamProxy(self.name, value)
else:
return EmptyParam
def value(self, obj):
#can't do .get(obj) or default because empty strings are 'falsey'
return self.values[obj] if obj in self.values else self.default
def __set__(self, obj, value):
self.values[obj] = str(value)
class ParamProxy:
def __init__(self, name, value):
self.name = name
self.value = value
def as_pair(self):
return (self.name, self.value)
def as_param(self):
return self.__str__()
def __str__(self):
return self.name + '=' + urlencode(self.value)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment