Program for sending emails
Because if you define something like:

def foo(**kwargs):
    pass

  
  Then to call it, you can't do something like:

options = []
options["one"] = 1
options["two"] = 2
foo(options)

  
  Right?


The aswer is Yes. But there are ways,  

**name is used in two ways.  

To define optional keyword argumnets in function definiton.  

def f(**kwargs): pass. Here the argument of function f, kwargs is optional. You can legitimately call f like f() i.e without arguments. It's utility is you can pass unlimited number of keyword arguments like one=1,...  

To unpack a dict to pass arguments at function invocation.  

If a function is defined with some arguments whether it's required or optional, its arguments can be passed by **dict when invoking the function. f.e  

def f(a,b=2): pass


This function has two arguments one is required. To call it with one argument, you can do,  

arg = dict(a=111)
f(**arg)


With two argumnets,  

arg = dict(a=111,b=222)
f(**arg)


Combining the two **name form.  

def f(**kwargs): pass  


can be called as follows,  

f()
f(a=1,b=2,c=3)
arg = dict(foo=1,bar=2)
f(**arg)


The send_email method can be simplified.  

def send_email(self, from, to, sub, body, **options):
    ''' 
        This method sends an email by taking four req. args
        from, to, sub, body and optional 'cc' and 'bcc' keyword args
    ''' 
    from = from
    to = to
    subject= sub
    text = body
    cc = options.get('cc')
    if cc is not None:
            #use this property
    bcc = options.get('bcc')
    if bcc is not None:
            #use this property


The 'docstring' can be checked by calling,  

help('classname or obj'.send_email)
'classname or obj'.send_email.__doc__


and can be called as follows,  

obj.send_email('me@example.com', 'you@example.com', 'hi', 'howdy', cc='he@example.com')  


or  

mail1 = dict(from='she@example.com', to='he@example.com', sub='date', body='free tonight?', bcc='you@example.com')
obj.send_email(**mail1)