473,395 Members | 2,151 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

Getting a function name from string

If I have a string that contains the name of a function, can I call it?
As in:

def someFunction():
print "Hello"

s = "someFunction"
s() # I know this is wrong, but you get the idea...

/David
Nov 2 '05 #1
5 14776
"David Rasmussen" <da*************@gmx.net> wrote in message
news:43**********************@dtext02.news.tele.dk ...
If I have a string that contains the name of a function, can I call it?
As in:

def someFunction():
print "Hello"

s = "someFunction"
s() # I know this is wrong, but you get the idea...

/David


Lookup the function in the vars() dictionary.
def fn(x): .... return x*x
.... vars()['fn'] <function fn at 0x009D67B0> vars()['fn'](100)

10000

-- Paul
Nov 2 '05 #2
"Paul McGuire" <pt***@austin.rr._bogus_.com> writes:
"David Rasmussen" <da*************@gmx.net> wrote in message
news:43**********************@dtext02.news.tele.dk ...
If I have a string that contains the name of a function, can I call it?
As in:

def someFunction():
print "Hello"

s = "someFunction"
s() # I know this is wrong, but you get the idea...

/David


Lookup the function in the vars() dictionary.
def fn(x): ... return x*x
... vars()['fn'] <function fn at 0x009D67B0> vars()['fn'](100) 10000


vars() sans arguments is just locals, meaning it won't find functions
in the global name space if you use it inside a function:
def fn(x): .... print x
.... def fn2(): .... vars()['fn']('Hello')
.... fn2() Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 2, in fn2
KeyError: 'fn'


Using globals() in this case will work, but then won't find functions
defined in the local name space.

For a lot of uses, it'd be better to build the dictionary by hand
rather than relying on one of the tools that turns a namespace into a
dictionary.

<mike
--
Mike Meyer <mw*@mired.org> http://www.mired.org/home/mwm/
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.
Nov 3 '05 #3
David Rasmussen wrote:
If I have a string that contains the name of a function, can I call it?
As in:

def someFunction():
print "Hello"

s = "someFunction"
s() # I know this is wrong, but you get the idea...


py> eval("someFunction()")
'Hello'
py> eval(s)() # note the second pair of brackets
'Hello'

See also exec -- but before you use either eval or
exec, make sure you are fully aware of the security
implications. Whatever a user could do to your system
by sitting down in front of it with a Python
interactive session open and typing commands at the
keyboard, they can also do remotely if you call exec on
input they provide.

So you probably don't want to be calling exec on
strings that you get from random users via a website.

It has been my experience that, more often than not,
any time you think you want to evaluate strings, you
don't need to.

For instance, instead of passing around the name of the
function as a string:

s = "someFunction"
eval(s)()

you can pass around the function as an object:

s = someFunction # note the lack of brackets
s()

--
Steven.

Nov 3 '05 #4
On Wed, 02 Nov 2005 19:01:46 -0500, Mike Meyer <mw*@mired.org> wrote:
"Paul McGuire" <pt***@austin.rr._bogus_.com> writes:
"David Rasmussen" <da*************@gmx.net> wrote in message
news:43**********************@dtext02.news.tele.dk ...
If I have a string that contains the name of a function, can I call it?
As in:

def someFunction():
print "Hello"

s = "someFunction"
s() # I know this is wrong, but you get the idea...

/David


Lookup the function in the vars() dictionary.
> def fn(x):

... return x*x
...
> vars()['fn']

<function fn at 0x009D67B0>
> vars()['fn'](100)

10000


vars() sans arguments is just locals, meaning it won't find functions
in the global name space if you use it inside a function:
def fn(x):... print x
... def fn2():... vars()['fn']('Hello')
... fn2()Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 2, in fn2
KeyError: 'fn'


Using globals() in this case will work, but then won't find functions
defined in the local name space.

For a lot of uses, it'd be better to build the dictionary by hand
rather than relying on one of the tools that turns a namespace into a
dictionary.

IMO it would be nice if name lookup were as cleanly
controllable and defined as attribute/method lookup.
Is it a topic for py3k?

Regards,
Bengt Richter
Nov 3 '05 #5
bo**@oz.net (Bengt Richter) writes:
For a lot of uses, it'd be better to build the dictionary by hand
rather than relying on one of the tools that turns a namespace into a
dictionary.

IMO it would be nice if name lookup were as cleanly
controllable and defined as attribute/method lookup.
Is it a topic for py3k?


I'm not sure what you mean by "cleanly controllable and defined". I'd
say name lookup is well defined and clean, as it's the same as it is
in pretty much any language that supports nested scopes, modulo
assignment creating things in the local scope. If you're talking about
letting users control that mechanism, that's definitely py3k material,
if not "python-like-language-that's-not-python" material. On the other
hand, if you just want to provide tools that let users do name lookups
the way they can do attribute lookups, that's easy, and we could add
that now:

getname(name) - returns the object name is bound to.
setname(name, value) - binds the variable name.

And maybe you want an optional third argument of a callable, which
causes the functions to work on names starting in the callables name
space.

The real question is (as always) - what's the use case? In particular,
what's the use case that we really want to encourage? As I said,
you're usually better off separating dynamically built names into
their own dictionary rather than trying to plug them into - or pull
them out of - one of the language namespaces. If you plug them in,
there's no way to get them back out except by mechanisms similar to
how you got them in, so you might as well let those mechanisms include
a dictionary. If you pull it out, you might as well have referenced
the bare name rather than the string. If you constructed the name in
some way, then changing the constructor to do a dictionary lookup
should be straightforward. All of these technics avoid problems that
come from overloading a language namespace.

Of course, I'm not omniscient, so you may have something that doesn't
fit those cases in mind - in which case, let's hear about it.

You can even arrange to run python code with your dictionary as a
namespace. Following are excerpts from a tool I'm currently not
working on.

class P:
def __init__(self):
self.variables = dict(In = self.set_input, Out = self.set_output,
Labels = self.set_labels, Float = DoubleVar,
String = StringVar, Int = IntVar)

def calculate(self):
for name, var in self.inputs.items():
self.variables[name] = var.get()
self.variables['calculate']()
for name, var in self.outputs.items():
var.set(self.variables[name])

def run(self):
self.app.mainloop(self.calculate)
def main(args):
app = P()
execfile(argv[1], app.variables)
app.run()

Here I create a dictionnary - P().variables - and populate it with
names and their values. I then run the code of interest with that
dictionary as the global namespace. The code will add things to the
namespace - in particular, "calculate". I then run a loop which will,
at unspecified times, set names in the P().variables dictionary, run
the "calculate" callable created by the code of interest, then copy
values out of the dictionary. This works ilke a charm. If you don't
want to deal with entire files, you can use exec, or even eval if you
just want to get a value back.

<mike
--
Mike Meyer <mw*@mired.org> http://www.mired.org/home/mwm/
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.
Nov 3 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Eyal | last post by:
Hey, I would appriciate if anyone can help on this one: I have a java object/inteface having a method with a boolean parameter. As I'm trying to call this method from a javascript it fails on...
11
by: Derek Martin | last post by:
Using VB.Net, I would like to retrieve the currently logged in user's DN from Active Directory. Alternatively, if, using WindowsIdentity, or something similar, I would like to get the user's full...
1
by: Lyle Fairfield | last post by:
Option Explicit ' requires VBScript to be installed ' (maybe don't give this to your sugnificant other as ' it gets deleted addresses as well as current) ' obvious fixups needed '1. how get...
1
by: pukya78 | last post by:
Hi, I am trying to get the current file and the line number which is getting executed. I used: MessageBox.Show(New StackTrace(New StackFrame(True)).GetFrame(0).GetFileLineNumber) which gives me...
1
by: kamleshsharmadts | last post by:
I am using Ajax with struts in web application. from jsp i am calling a function of ajax.js onclick of a button. code of that call function which calling from jsp given as below:- ...
4
by: AshishMishra16 | last post by:
HI friends, I am using the Flex to upload files to server. I m getting all the details about the file, but I m not able to upload it to Server. Here is the code i m using for both flex & for...
3
by: TC | last post by:
Hey All, I have some classes that I recently built for a website which uses the HttpWebRequest & HttpWebResponse objects from the System.Net namespace. Basically, the classes rap submitted data...
0
by: TG | last post by:
Hi! Once again I have hit a brick wall here. I have a combobox in which the user types the server name and then clicks on button 'CONNECT' to populate the next combobox which contains all the...
1
by: raghuvendra | last post by:
Hi I have a jsp page with 4 columns: namely Category name , Category order, Input field and a submit button. All these are aligned in a row. And Each Category Name has its corresponding Category...
5
by: tshad | last post by:
I have the following class in my VS 2008 project that has a namespace of MyFunctions. ********************************* Imports System Imports System.Text.RegularExpressions Namespace...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.