[Beginner] Calling a function by its name in a string

T

Tito

Hi all:

Is there a metalanguage capability in Python (I know there are many) to
call a function having its name in a string?

Something like:
__call__("foo")

instead of:
foo()

Regards,
Tito
 
B

Bill Mill

Hi all:

Is there a metalanguage capability in Python (I know there are many) to
call a function having its name in a string?

Something like:
__call__("foo")

instead of:
foo()

Peace
Bill Mill
bill.mill at gmail.com
 
M

Michael Hoffman

Tito said:
Hi all:

Is there a metalanguage capability in Python (I know there are many) to
call a function having its name in a string?

Something like:
__call__("foo")

instead of:
foo()

locals()["foo"]() will be a little more predictable than eval("foo()").
 
T

Tito

Thank you both for your quick answers.

What I wanted is to parameterize a function with another member
function, like this:

def printFunctionForEach(collection, functionName):
for elem in collection:
print eval("elem." + functionName + "()")

Moreover, I wanted to do it with a property:

def printPropertyForEach(collection, propertyName):
for elem in collection:
print eval("elem." + propertyName)

Is there another approach to do it?

Regards,
Tito
 
P

Paul Rubin

Tito said:
def printPropertyForEach(collection, propertyName):
for elem in collection:
print eval("elem." + propertyName)

Is there another approach to do it?

Yes, use the getattr function:

for elem in collection:
print getattr(elem, propertyName)
 
B

Bill Mill

Thank you both for your quick answers.

What I wanted is to parameterize a function with another member
function, like this:

def printFunctionForEach(collection, functionName):
for elem in collection:
print eval("elem." + functionName + "()")

Moreover, I wanted to do it with a property:

def printPropertyForEach(collection, propertyName):
for elem in collection:
print eval("elem." + propertyName)

Is there another approach to do it?

Sure, piece of cake:
.... def func1(self): print 'func1 called'
........ def func1(self): print 'other func1'
....
x = [test(), test2(), test()]
def call_this_func(lst, func_name):
.... for e in lst:
.... getattr(e, func_name)()
....func1 called
other func1
func1 called
Note that the getattr raises an AttributeError if func_name doesn't
exist in the object; you should probably wrap it in a try/except.

Peace
Bill Mill
bill.mill at gmail.com
 
P

Paolino

Tito said:
Hi all:

Is there a metalanguage capability in Python (I know there are many) to
call a function having its name in a string?

Something like:
__call__("foo")

instead of:
foo()

Regards,
Tito
eval('foo()') should do, but it's said a bad practice ;)
 
P

Peter Hansen

Tito said:
Thank you both for your quick answers.

What I wanted is to parameterize a function with another member
function, like this:

def printFunctionForEach(collection, functionName):
for elem in collection:
print eval("elem." + functionName + "()")

Note: "member function" is spelled "method" in Python.
Moreover, I wanted to do it with a property:

def printPropertyForEach(collection, propertyName):
for elem in collection:
print eval("elem." + propertyName)

And "property" (the way you are using it) is spelled "attribute".

In Python, properties are something else, similar to but more than just
attributes.

Use of such terms according to conventional Python usage will in future
make it somewhat easier to be understood and for you to understand the
responses.

Cheers,
-Peter
 
S

Steven D'Aprano

foobarred

Which is dangerous beyond belief if you are getting your string "foo()"
from a user, and if you aren't, you almost certainly can refactor your
code so you don't need eval.

You know, I really am getting sick of (1) people who ask how to shoot
themselves in the foot and (2) people who cheerfully load the gun and hand
it to them without a word of warning about the consequences. And then
we all act surprised when we learn about the latest virus or security hole
that allows a hostile user to use a music player or paint program to take
over the entire operating system. Or whatever.

"We're all adults here" only works for people who ARE adults. If you have
to ask about eval, you can't be trusted with it without at least a warning.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,262
Messages
2,571,310
Members
47,977
Latest member
MillaDowdy

Latest Threads

Top