Suggestions for good programming practices?

Jonathan Hogg jonathan at onegoodidea.com
Wed Jun 26 05:20:38 EDT 2002


On 26/6/2002 1:53, in article afb3a2$skm$0 at 216.39.172.122, "Bengt Richter"
<bokr at oz.net> wrote:

> Well, I meant using *args to allow detecting actual "no default-overriding
> argument passed", in place of x=None. The arg list items (only x here)
> don't have to remain unnamed long. E.g.,
> 
>>>> def foo(*args):
> ...     if len(args)==1:
> ...         print "We know we have one non-default arg: %s" % `args[0]`
> ...         x = args[0]
> ...     elif len(args)==0:
> ...         print "We can supply a default arg, even None"
> ...         x = None
> ...     else: raise TypeError,'foo() takes 0 or 1 arguments (%d given)' %
> len(args)
> ...     print 'Effective arg was: %s' % `x`
> ...

I find this stuff much easier to write with a helper function:

>>> def shift():
...     global _0
...     __, _0 = _0[0], _0[1:]
...     return __
... 

Then I can write the function 'foo' much more naturally as:

>>> def foo( *args ):
...     global _0; _0 = args
...     try:
...         x = shift()
...     except IndexError:
...         print 'We can supply a default arg, even None'
...         x = None
...     else:
...         try:
...             shift()
...         except IndexError:
...             print 'We know we have one non-default arg: %s' % `x`
...         else:
...             raise TypeError( 'foo() takes 0 or 1 arguments' )
...     print 'Effective arg was: %s' % `x`
...

This can be further simplified by removing the '*args' nonsense altogether
and defining another helper function:

>>> def p( f ):
...     def _p( *args ): global _0; _0 = args; f()
...     return _p
...
>>> def foo():
...     try:
...         x = shift()
[etc]
...
>>> p(foo)( 'hello world' )



How did we get onto this from 'Suggestions for good programming practices'?

Jonathan




More information about the Python-list mailing list