Форум сайта python.su
Назрел вопрос, как вызвать функцию имея имя функции в строковой переменной
Типа
def func1():
print “func1”
call_func(“func1”, далее возможен список параметров)
call_func (имя вымышленное) - какую функцию надо тут использовать? И возможно ли это?
Спасибо
Офлайн
def func():
print “I'm func!”
return 1
f = globals()
print f
print f()
Офлайн
смысл этого примера: зная имя функции можно получить ее саму через словарь пространства имен. Здесь globals() возвращает словарь глобального пространства имен модуля.
Офлайн
Спасибо.. А как узнать функции определенные в некотром классе? И соотвественно вызвать её
Отредактировано (Дек. 18, 2007 16:31:15)
Офлайн
class Data:
def init1(self):
pass
def init2(self):
pass
print dir(Data())
Офлайн
Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.
Отредактировано (Дек. 18, 2007 16:57:47)
Офлайн
>>> class Foo(object):
def bar(self, arg1, arg2='2', arg3='3', **kwargs):
print arg1, arg2, arg3, kwargs
>>> class_name = ‘Foo’
>>> method_name = ‘bar’
>>> class_inst = globals()
>>> foo = class_inst()
>>> foo.bar('1', ‘22222’, ‘33333’, kwarg1='kwarg1', kwarg2='kwarg2')
1 22222 33333 {'kwarg1': ‘kwarg1’, ‘kwarg2’: ‘kwarg2’}
>>> method = getattr(foo, method_name)
>>> args = ('1', ‘22222’, ‘33333’, {'kwarg1': ‘kwarg1’, ‘kwarg2’: ‘kwarg2’})
>>> method(args, *args, **args)
1 22222 33333 {'kwarg1': ‘kwarg1’, ‘kwarg2’: ‘kwarg2’}
Офлайн
Albert1980функция geattr поможет. и для модуля и для класса.
Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.
Офлайн
Могу предложить еще такой вариант.
Хоть это вариант и смахивает на грязный хак, однако работает быстро и хорошо:
class a_:
def b(self, text):
print text
a= a_()
#собственно сам вызов
eval(“a.b”)('bla-bla')
Офлайн
Спасибо всем кто ответил
Офлайн