Implicit lists
Max M
maxm at mxm.dk
Fri Jan 31 03:54:19 EST 2003
Erik Max Francis wrote:
> In dynamically-typed languages like Python, overloading functions (which
> is I presume the crux of where you're doing this test) based on type
> usually isn't a great idea. Usually it's better to have two
> functions/methods instead.
This is a bad idea in many cases.
Very often you want a function that has this interface:
def getWhere(options): # options is a list
"generates query"
it could generate a query like:
SELECT * FROM table WHERE option='spam' or option='ni'
So the easiest way to do this is to write a function like this:
def getWhere(options):
return 'SELECT * FROM table WHERE %s' % ' or '.join(
['option=%s' for opt in options])
But frequently you will only call getWhere() with one argument. So
instead of having to call it like:
def getWhere(['spam']):
"generates query"
You want to call it like
def getWhere('spam'):
"generates query"
If you do not have polymorphic interfaces you will need to typecheck
your argument everytime you call the function:
if type(options) == type(''): # I *know* this sucks!
getWhere([options])
else:
getWhere(options)
If you want to make 2 functions:
def getWhereByOne('spam'):
"generates query"
def getWhere(['spam']):
"generates query"
You will need to check if the argument is a list or a string in all the
code wich calls one of the function.
if type(options) == type(''):
getWhereByOne(options)
else:
getWhere(options)
This is no better than the first option.
So the sane approach is to do the check inside the function:
def getWhere(options):
if type(options) == type(''): # I *know* this sucks!
options = [options]
return 'SELECT * FROM table WHERE %s' % ' or '.join(
['option=%s' for opt in options])
This will lead to far the most simple use of the function.
--
hilsen/regards Max M Rasmussen, Denmark
http://www.futureport.dk/
Fremtiden, videnskab, skeptiscisme og transhumanisme
More information about the Python-list
mailing list