I am wondering if the attached switch manager might be a way to get
rid of having to maintain a lot of wrappers for at least expand() and
maybe for other methods. The idea is this (using expand as an
example):
expr.expand() uses all default expansion methods
expr.expand(log=False) uses all default expansions EXCEPT log (can
also use log=0 instead of log=False)
expr.expand(log=True) uses ONLY the log expansion (can also use log=1
instead of log=True)
expr.expand(mul=True,multinomial=True) uses ONLY the mul and
multinomial expansion
The change that would make this possible requires only that the
default values for the different expansion methods be set to None and
then a couple lines of code are added in the expand, so
this...
def expand(self, deep=True, power_base=True, power_exp=True,
mul=True, \
log=True, multinomial=True, basic=True, **hints):
hints['power_base'] = power_base
hints['power_exp'] = power_exp
hints['mul'] = mul
hints['log'] = log
hints['multinomial'] = multinomial
hints['basic'] = basic
becomes this...
def expand(self, deep=True, power_base=None, power_exp=None,
mul=None, \
log=None, multinomial=None, basic=None, **hints):
dhints={} #<--- additional line
dhints['power_base'] = power_base
dhints['power_exp'] = power_exp
dhints['mul'] = mul
dhints['log'] = log
dhints['multinomial'] = multinomial
dhints['basic'] = basic
switch_manager(dhints, default=True) {} #<--- additional line
hints.update(dhints) {} #<--- additional line
It's not mandatory to create a new dictionary if the hints has only
True or False values in it. It's only necessary if hints has other
values in it. In that case, the first and last additional lines marked
above are not necessary, and dhints is changed to hints.
######## attachment
"""
demonstration of managing multiple switches for a function
"""
def switch_manager(opt_dict, default=True):
"""Given a dictionary of switch values (True, False, or None)
return the dictionary with switches True or False according to
the following logic:
-if all swtiches have been set and there are no None values,
change nothing;
-if all switches are neutral (value = None) set them all to the
default value;
-if some switches are True and some are False then set the rest to
the default value;
-if one or more switches have been set to True then set the rest
to False;
-if one or more switches have been set to False then set the rest
to True.
"""
vals = set(filter(lambda x: x != None, opt_dict.values()))
if len(vals) == len(opt_dict):
return #there are no switches in neutral (None) position
if not all(tmp in [True, False, None] for tmp in vals):
#actually, 1 or 0 will pass as True or False, too
raise ValueError('Expecting only True, False, or None
options.')
#make default opposite of what was given
if not vals or len(vals) > 1:
pass #don't change the default
elif vals.pop() == True:
default = False
else:
default = True
#set None values to default
for k in opt_dict:
if opt_dict[k] == None:
opt_dict[k] = default
def demo(a=None, b=None, c=None, **opts):
default_opts={} #these are the options which must take on a value
default_opts['a'] = a
default_opts['b'] = b
default_opts['c'] = c
switch_manager(default_opts, default=True)
opts.update(default_opts)
#do whatever you are going to do with the options
for k in sorted(opts):
print k,opts[k]
print 'demo()=all true by default'
demo()
print 'demo(a=True) only a true'
demo(a=True)
print 'demo(a=True,b=True) only a and b true; equivalent to demo
(c=False)'
demo(a=True,b=True)
print 'demo(a=True,b=False) c is true by default; equivalent to demo
(b=False)'
demo(a=True,b=False)
print 'demo(b=False) only b false'
demo(b=False)
print 'demo(d=42) a,b,c have default True and d is 42'
demo(d=42)
print 'demo(a=False,d=42) b,c have default True and d is 42'
demo(a=False,d=42)
print 'demo(b=True,d=42) a,c False and d is 42'
demo(b=True,d=42)
## output
'''
demo()=all true by default
a True
b True
c True
demo(a=True) only a true
a True
b False
c False
demo(a=True,b=True) only a and b true; equivalent to demo(c=False)
a True
b True
c False
demo(a=True,b=False) c is true by default; equivalent to demo(b=False)
a True
b False
c True
demo(b=False) only b false
a True
b False
c True
demo(d=42) a,b,c have default True and d is 42
a True
b True
c True
d 42
demo(a=False,d=42) b,c have default True and d is 42
a False
b True
c True
d 42
demo(b=True,d=42) a,c False and d is 42
a False
b True
c False
d 42
'''
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sympy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [email protected]
For more options, visit this group at http://groups.google.com/group/sympy?hl=en
-~----------~----~----~----~------~----~------~--~---