Page 1 of 1

Using variable to call a function

Posted: Wed Nov 11, 2015 1:18 am
by Invisible Ray
I'd like to dynamically call a function from the Message() module.

In pseudo-code:
function x() - does x thing
function y() - does y thing
I have a select list in my module with items 'x' and 'y'.
When one of the items is selected in the module, the function with that name runs.

in other words:
if msg == <select list selection>:
myFunc = <selection>
myFunc()
(then either function x or function y runs, depending on which one is selected)

I've tried a few variations of this, and I keep getting the error "TypeError: 'unicode' object is not callable".

Re: Using variable to call a function

Posted: Wed Nov 11, 2015 2:17 am
by Invisible Ray
The next thing I tried is creating a dictionary where each item in the select list is the key and the selection +'()' is the value.

When I try to call a function with this construction, I get the error "TypeError: 'str' object is not callable"

Is there any way to change a 'str' object or 'unicode' object into a function object?

Re: Using variable to call a function

Posted: Wed Nov 11, 2015 7:35 pm
by anomad
. you might be able to store a reference to the function in a variable, but i'm not sureā€¦

. something like this ?

https://www.daniweb.com/programming/sof ... a-variable


-james
(a nomad. )

Re: Using variable to call a function

Posted: Wed Nov 11, 2015 9:38 pm
by Invisible Ray
That looks like it might work. I'll give it a try.

Re: Using variable to call a function

Posted: Sat Nov 14, 2015 7:21 pm
by Invisible Ray
I got it to work, but I had to use a slight workaround.

Function of the script: Use a select list to trigger predefined sets of layer effects via functions

variables used in the script:

# list used to populate a text list control
fxList = ['none','scale','scale_w']

# assigning variables to functions
fx0 = nofx
fx1 = fscale
fx2 = fscale_w

# ordered list of the variables
funcList = [fx0,fx1,fx2]

# control name and Script Connect message of the text list control
'lfxL'

lfx = 0 #index position of low freq fx selected
mfx = 0 #index position of mid freq fx selected
hfx = 0 #index position of hi freq fx selected

# list used to store params for the three FX functions
# is low active, lfx, is mid active, mfx, is high active, hfx
actFX = [0,lfx,0,mfx,0,hfx]

<script snippet in 'MessageEvent() module>

if msg == 'lfxL':
myFunc = module.getValue('lfxL', 'selection') #get item selected in list
listPos = fxList.index(myFunc)
actFX[1] = listPos

********************************

What the code does:
1) user selects an item in the list
2) the selection sends a message: 'lfxL'
3) variable myFunc is set to the text of the item selected in the list
4) listPos is set to the index position of myFunc when found in the list 'fxList'
5) actFX list item at position [1] is updated with the value of listPos


What I would like to do to make the code more efficient:
I should be able to directly assign the index position of the item selected in lfxL to the item actFX[1]

My problem is that I can't figure out how to return the index number of an item selected in a list control. I can return the text of the selected item, but not the index number, so I have to search for the text string in a list of the items, then assign that number to the actFX list.

** using this built in function: module.getValue('lfxL', 'selection') **
It doesn't matter what I choose for the Value of the control attribute.
If I set it to "Text" I get the text of the item selected
If I set it to "Abs. Index" I get 0, no matter which item I select
If I set it to "Prop. Index" I get 0, no matter which item I select

Re: Using variable to call a function

Posted: Sat Nov 14, 2015 10:24 pm
by anomad
. have you considered using dictionaries ?

. then create your fxList like myFX = {'nofx' : 'None', 'scale' : 'Scale Stuff..' }

. the your list could send 'nofx' and you would reference myFX( text returned from list )

. if you're tracking multiple variables :

myFX = {
'nofx' : { 'name' : 'None', 'action' : 'so something here ' } ,
'fx1' : { 'name' : 'FX 1 ', 'action' : 'do something cool here', 'lfx' : 0, ',mfx' : 0, 'hfx' : 0 },
'fx2' : { 'name' : 'FX 2 ', 'action' : 'do something else cool here', 'lfx' : 0.4, ',mfx' : 0.7, 'hfx' : 0.25555553 }
}

. then you reference things like this : myFX['fx1']['mfx']


. might be something to look into


-james
(a nomad. )