Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 18, 2007 16:15:12

Albert1980
От:
Зарегистрирован: 2007-12-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

Назрел вопрос, как вызвать функцию имея имя функции в строковой переменной
Типа

def func1():
print “func1”

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

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

Спасибо



Офлайн

#2 Дек. 18, 2007 16:25:12

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени


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


f = globals()
print f
print f()



Офлайн

#3 Дек. 18, 2007 16:26:26

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

смысл этого примера: зная имя функции можно получить ее саму через словарь пространства имен. Здесь globals() возвращает словарь глобального пространства имен модуля.



Офлайн

#4 Дек. 18, 2007 16:30:51

Albert1980
От:
Зарегистрирован: 2007-12-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

Спасибо.. А как узнать функции определенные в некотром классе? И соотвественно вызвать её



Отредактировано (Дек. 18, 2007 16:31:15)

Офлайн

#5 Дек. 18, 2007 16:50:34

Igorek
От:
Зарегистрирован: 2006-12-08
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

class Data:
def init1(self):
pass
def init2(self):
pass

print dir(Data())
Получите список функций определённый для этого класса.



Офлайн

#6 Дек. 18, 2007 16:55:54

Albert1980
От:
Зарегистрирован: 2007-12-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.



Отредактировано (Дек. 18, 2007 16:57:47)

Офлайн

#7 Дек. 18, 2007 18:07:16

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени


>>> 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’}



Офлайн

#8 Дек. 19, 2007 00:27:25

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

Albert1980
Спасибо… :)
Боюсь совсем достать :) а как теперь вызвать метод класса? опять же имея имя этого метода только в строковой переменной.
функция geattr поможет. и для модуля и для класса.



Офлайн

#9 Дек. 19, 2007 01:44:16

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

Могу предложить еще такой вариант.
Хоть это вариант и смахивает на грязный хак, однако работает быстро и хорошо:

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

a= a_()
#собственно сам вызов
eval(“a.b”)('bla-bla')



Офлайн

#10 Дек. 19, 2007 08:54:20

Albert1980
От:
Зарегистрирован: 2007-12-11
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Вызов функции по её строковому имени

Спасибо всем кто ответил



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version