Albert1980
Дек. 18, 2007 16:15:12
Назрел вопрос, как вызвать функцию имея имя функции в строковой переменной
Типа
def func1():
print “func1”
call_func(“func1”, далее возможен список параметров)
call_func (имя вымышленное) - какую функцию надо тут использовать? И возможно ли это?
Спасибо
bialix
Дек. 18, 2007 16:25:12
def func():
print “I'm func!”
return 1
f = globals()
print f
print f()
bialix
Дек. 18, 2007 16:26:26
смысл этого примера: зная имя функции можно получить ее саму через словарь пространства имен. Здесь globals() возвращает словарь глобального пространства имен модуля.
Albert1980
Дек. 18, 2007 16:30:51
Спасибо.. А как узнать функции определенные в некотром классе? И соотвественно вызвать её
Igorek
Дек. 18, 2007 16:50:34
class Data:
def init1(self):
pass
def init2(self):
pass
print dir(Data())
Получите список функций определённый для этого класса.
Albert1980
Дек. 18, 2007 16:55:54
Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.
poltergeist
Дек. 18, 2007 18:07:16
>>> 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’}
bialix
Дек. 19, 2007 00:27:25
Albert1980
Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.
функция geattr поможет. и для модуля и для класса.
shiza
Дек. 19, 2007 01:44:16
Могу предложить еще такой вариант.
Хоть это вариант и смахивает на грязный хак, однако работает быстро и хорошо:
class a_:
def b(self, text):
print text
a= a_()
#собственно сам вызов
eval(“a.b”)('bla-bla')
Albert1980
Дек. 19, 2007 08:54:20
Спасибо всем кто ответил