function argument dependent on another function argument?

Aaron Brady castironpi at gmail.com
Mon Jan 19 03:56:12 CET 2009


On Jan 18, 12:02 pm, Rob Williscroft <r... at freenet.co.uk> wrote:
> Aaron Brady wrote innews:582ef883-0176-4984-9521-6c1894636891 at a26g2000prf.googlegroups.com
> in comp.lang.python:
>
>
>
> > On Jan 18, 10:44 am, Rob Williscroft <r... at freenet.co.uk> wrote:
> >> Aaron Brady wrote
> >> innews:6a10378f-addb-4d56-bc1b-0c382b3cb957 at t26g2000prh
> > .googlegroups.com
> >> in comp.lang.python:
>
> >> > It is too bad that it is so much work to detect whether 'y' was
> >> > passed in the function call directly.  However, sentinel is just as
> >> > good (or nearly); at worst, you need one sentinel per argument per
> >> > function,
>
> >> One per Module should be good enough. The only reason None doesen't
> >> suffice is that it has other legitimate uses.  Though to be honest
> >> I would always use None as the sentinel if it wasn't a legitimate
> >> argument.
>
> >> > which is possible to create, which has a specific meaning.  If you
> >> > are
> >> > making systematic function calls, e.g. with a dictionary or list,
> >> > you can just use the sentinel in the dictionary.
>
> >> IIUYC then, one sentinel is still only needed as the missing argument
> >> is indicated by *both* position and value or by name and value (in
> >> the case of a keyword-dictionary), so seperate distinct sentinel
> >> objects aren't required, for example:
>
> >> SENTINEL = object()
>
> >> def f( a, b, c = SENTINEL, d = SENTINEL ):
> >>   print( "values: %r" % ( ( a, b, c, d ), ) )
> >>   if c is SENTINEL:
> >>     print( "c is missing" )
> >>   if d is SENTINEL:
> >>     print( "d is missing" )
>
> >> f( *( 1, 2, SENTINEL, SENTINEL ) )
>
> >> f( **dict( a = 1 , b = 2, d = 4 ) )
>
> >> f( **dict( a = 1 , b = 2, d = 4, c = SENTINEL ) )
> > I don't have a concrete example, so you may prove to be right, but I'm
> > not convinced.
>
> I'm afraid I can't think of a use case for passing default values around
> eiither, and I suspect if we were to come up with one, a better solution
> that didn't involve passing default values around could be found.
>
> > If you have one function with an argument that defaults to an empty
> > list, and calls another with an argument that defaults to an empty
> > dict, then what is the meaning of passing sentinel to the first one?
> > Whereas, if each had their own, then passing the first one's default
> > would mean the empty list, and passing the second one's default would
> > mean the dict.
>
> If you *mean* to pass an "empty list" or "empty dict"'s you should do
> it like:
>
>   function_taking_list( [] )
>   function_taking_dict( {} )
>
> Its when you don't (have reason to) care that you need default arguments.

'None' isn't a valid value for many standard library functions.  So,
if you try to pass it meaning, "Whatever the default value you usually
use is," you'll get an error.  Sometimes, the functions don't even use
a public sentinel, so if you want the default value, you either have
to know what it is, or you can't pass anything to that parameter.
This is usually possible, it just prevents making a uniform call to a
function.  If you need to do some calculations to determine what
parameters you're going to pass, you're stuck testing their presence
with 'if-else' combinations, then calling individually.



More information about the Python-list mailing list