On Mon, 15 Mar 2010 05:38:43 -0700 (PDT)
Karjer Jdfjdf <[email protected]> wrote:

> I want to use **kwargs to check a list of conditions (if true do this, if 
> false do nothing) besides required parameters ( in sample a and b).  
> Sometimes I want to add a Python object (in example a dictionary and a list). 
> Below is my first **kwargs-brew.
> 
> ###START
> 
> def function_with_kwargs(a, b, **kwargs):
>     options = {
>         'logfile'   : None,
>         'door'      : 'kitchendoor',
>         'roof'      : 'tiles',
>         'mydict'    : None,
>         'mylist'    : None, }
>     options.update(kwargs)

The default set of options is a constant independant of the function and of its 
(other) arguments. So, I would rather define it outside. I find it clearer.

from copy import copy
OPTIONS = {
        'logfile'       : None,
        'door'          : 'kitchendoor',
        'roof'          : 'tiles',
        'mydict'        : None,
        'mylist'        : None,
}
def function_with_kwargs(a, b, **kwargs):
        options = copy(OPTIONS)
        options.update(kwargs)
        print options

(Must be copied to avoid the defaults to be altered by update.)

>     logfile = options.get('logfile')
>     if logfile == None:
>         print "No logging"
>     else:
>         print "Logging"

You don't need to use get, use options['logfile'] instead. Get is only useful 
if you use its default_value parameter. This would indeed be a good alternative 
to a global default dict for options:
        logfile = options.get('logfile', None)
        ...
        roof = options.get('roof', 'tiles')
or maybe better the general pattern:
        x = options.get('x', OPTIONS['x'])

>     mydict = options.get('mydict')
>     if mydict == None:
>         print "Do nothing with dictionary"
>     else:
>         print "Do something with dictionary"
> 
>     mylist = options.get('mylist')
>     if mylist == None:
>         print "Do nothing with list"
>     else:
>         print "Do something with list"
> 
>     print "END OF FUNCTION\n"
>         
> 
> somedict = { 'a': '1', 'b': '2', }
> somelist = ['1', '2']
> 
> #DO SOMETHING
> function_with_kwargs(1, 2, logfile='log.txt', door='frontdoor', 
> mydict=somedict, mylist=somelist)
> 
> #DO NOTHING
> function_with_kwargs(1, 2, door='frontdoor')
> 
> 
> 
> ### END
> 
> I have 2 questions about this code:
> 
> 1. Can I use this in Python 3 ?  I'm not sure if I can use **kwargs in Python 
> 3 because it uses the "apply" builtin (if I understand it correctly)
> 
> "At this writing, both apply and the special call syntax described in this
> section can be used freely in Python 2.5, but it seems likely that apply
> may go away in Python 3.0. If you wish to future-proof your code, use
> the equivalent special call syntax, not apply."
> 
> 2. Are there better ways to achieve what I want to do?

In this case, I would use a general config object, which attributes are 
individual parameters. You need to first define a fake Config class (because 
for any reason we cannot alter direct instances of object).

Denis
________________________________

la vita e estrany

spir.wikidot.com

_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to