Найти - Пользователи
Полная версия: Вызов функции по её строковому имени
Начало » Python для экспертов » Вызов функции по её строковому имени
1 2
Albert1980
Назрел вопрос, как вызвать функцию имея имя функции в строковой переменной
Типа

def func1():
print “func1”

call_func(“func1”, далее возможен список параметров)

call_func (имя вымышленное) - какую функцию надо тут использовать? И возможно ли это?

Спасибо
bialix

def func():
print “I'm func!”
return 1


f = globals()
print f
print f()
bialix
смысл этого примера: зная имя функции можно получить ее саму через словарь пространства имен. Здесь globals() возвращает словарь глобального пространства имен модуля.
Albert1980
Спасибо.. А как узнать функции определенные в некотром классе? И соотвественно вызвать её
Igorek
class Data:
def init1(self):
pass
def init2(self):
pass

print dir(Data())
Получите список функций определённый для этого класса.
Albert1980
Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.
poltergeist

>>> 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
Albert1980
Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.
функция geattr поможет. и для модуля и для класса.
shiza
Могу предложить еще такой вариант.
Хоть это вариант и смахивает на грязный хак, однако работает быстро и хорошо:

class a_:
def b(self, text):
print text

a= a_()
#собственно сам вызов
eval(“a.b”)('bla-bla')
Albert1980
Спасибо всем кто ответил
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB