Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

0 views
Skip to first unread message

Tito

unread,
Jul 27, 2005, 2:12:35 PM7/27/05
to
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

Bill Mill

unread,
Jul 27, 2005, 2:18:25 PM7/27/05
to Tito, pytho...@python.org

>>> def foo(): print "foobarred"
...
>>> foo()
foobarred
>>> eval("foo()")
foobarred
>>>

Peace
Bill Mill
bill.mill at gmail.com

Paolino

unread,
Jul 27, 2005, 3:17:08 PM7/27/05
to Tito, pytho...@python.org
eval('foo()') should do, but it's said a bad practice ;)

Michael Hoffman

unread,
Jul 27, 2005, 2:37:52 PM7/27/05
to

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

Grant Edwards

unread,
Jul 27, 2005, 2:38:35 PM7/27/05
to
On 2005-07-27, Paolino <paolo.v...@gmail.com> wrote:

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

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

An alternative to eval() is:

>>> def foo():
... print "foo was called"
...
>>> s = "foo"
>>> globals()[s]()
foo was called
>>>

--
Grant Edwards grante Yow! I'm meditating on
at the FORMALDEHYDE and the
visi.com ASBESTOS leaking into my
PERSONAL SPACE!!

Tito

unread,
Jul 27, 2005, 2:46:16 PM7/27/05
to
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

Tito

unread,
Jul 27, 2005, 2:48:28 PM7/27/05
to
> Thank you both for your quick answers.

Thank you *all* for your quick answers.

Paul Rubin

unread,
Jul 27, 2005, 3:02:41 PM7/27/05
to
Tito <titogarcia...@gmail.com> writes:
> 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)

Bill Mill

unread,
Jul 27, 2005, 3:04:24 PM7/27/05
to Tito, pytho...@python.org
On 7/27/05, Tito <titogarcia...@gmail.com> wrote:

Sure, piece of cake:

>>> class test:
... def func1(self): print 'func1 called'
...
>>> class test2:
... 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)()
...
>>> call_this_func(x, 'func1')
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.

Tito

unread,
Jul 27, 2005, 3:28:46 PM7/27/05
to
Once again: thank you.

Peter Hansen

unread,
Jul 27, 2005, 6:22:45 PM7/27/05
to
Tito wrote:
> 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

Steven D'Aprano

unread,
Jul 27, 2005, 7:55:33 PM7/27/05
to
On Wed, 27 Jul 2005 14:18:25 -0400, Bill Mill wrote:

> On 7/27/05, Tito <titogarcia...@gmail.com> wrote:
>> 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()
>>
>
>>>> def foo(): print "foobarred"
> ...
>>>> foo()
> foobarred
>>>> eval("foo()")
> 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.


--
Steven.

0 new messages