Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с функциями 
:(
    Опции темы
AlexMakarov
Дата 2.10.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.7.2006

Репутация: нет
Всего: нет



Помогите пожалуста!
У меня в программе есть строка, которая содержит имя функции, могу я как нибудь вызвать эту функцию???

PM MAIL   Вверх
pythonwin
Дата 2.10.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(AlexMakarov @  2.10.2006,  23:08 Найти цитируемый пост)
У меня в программе есть строка, которая содержит имя функции, могу я как нибудь вызвать эту функцию???


Код

def mydef():
    print 2+2*2
s='mydef'
exec s+'()'


или

Код

def mydef():
    print 2+2*2
s='mydef'
i=eval(s+'()')

PM WWW GTalk Jabber   Вверх
PyAlexey
Дата 2.10.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2006
Где: Россия, Нижний Но вгород

Репутация: 6
Всего: 7



Прежде чем вызывать функции, стоит почитать учебник. А то, как обратно отзывать будите?
PM   Вверх
pythonwin
Дата 2.10.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(PyAlexey @  2.10.2006,  23:15 Найти цитируемый пост)
А то, как обратно отзывать будите? 

 smile 
PM WWW GTalk Jabber   Вверх
AlexMakarov
Дата 2.10.2006, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 25.7.2006

Репутация: нет
Всего: нет



pythonwin спасибо большое
PM MAIL   Вверх
pythonwin
Дата 2.10.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(AlexMakarov @  2.10.2006,  23:24 Найти цитируемый пост)
pythonwin спасибо большое 

пожалуйста! smile

Заходи ещё! smile
PM WWW GTalk Jabber   Вверх
Cr@$h
Дата 2.10.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(PyAlexey @  2.10.2006,  17:15 Найти цитируемый пост)
Прежде чем вызывать функции, стоит почитать учебник.

Раз человек спрашивает, у него есть причины, например, не понял. Если считаете этот вопрос не достойным вашего внимания, то не обращайте на него его.

PyAlexey, ++ за твою rtfm-ую "шутку". Надеюсь, в следующий раз ты будешь отвечать на вопрос или просто не обращать на него внимание ;)

pythonwin, ++ за отзывчивость.
PM MAIL ICQ   Вверх
PyAlexey
Дата 2.10.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2006
Где: Россия, Нижний Но вгород

Репутация: 6
Всего: 7



Если честно, я просто сначала не понял вопроса ((. Подумал, что вопрос в том, как вызвать функцию, — то есть ламерский. Так что, извиняюсь.

Задам вопрос, наверное, по теме. В модуле xmlrpc есть такая интересная фишка: объект класса может иметь функции (которые отражают функции RPC-сервера) следующего вида.

Код
Obj.foo1.foo2.foo3.foo4.func()

Так вот, каким образом написать класс-структуру, динамически стоящую подобную «вложенность»?

Вчера полдня голову ломал — ничего не вышло. Но вскрытие xmlrpc кое-что всё-таки показало:

Код

class _MultiCallMethod:
    # some lesser magic to store calls made to a MultiCall object
    # for batch execution
    def __init__(self, call_list, name):
        self.__call_list = call_list
        self.__name = name
    def __getattr__(self, name):
        return _MultiCallMethod(self.__call_list, "%s.%s" % (self.__name, name))
    def __call__(self, *args):
        self.__call_list.append((self.__name, args))

class MultiCallIterator:
    """Iterates over the results of a multicall. Exceptions are
    thrown in response to xmlrpc faults."""

    def __init__(self, results):
        self.results = results

    def __getitem__(self, i):
        item = self.results[i]
        if type(item) == type({}):
            raise Fault(item['faultCode'], item['faultString'])
        elif type(item) == type([]):
            return item[0]
        else:
            raise ValueError,\
                  "unexpected type in multicall result"

class MultiCall:
    """server -> a object used to boxcar method calls

    server should be a ServerProxy object.

    Methods can be added to the MultiCall using normal
    method call syntax e.g.:

    multicall = MultiCall(server_proxy)
    multicall.add(2,3)
    multicall.get_address("Guido")

    To execute the multicall, call the MultiCall object e.g.:

    add_result, address = multicall()
    """

    def __init__(self, server):
        self.__server = server
        self.__call_list = []

    def __repr__(self):
        return "<MultiCall at %x>" % id(self)

    __str__ = __repr__

    def __getattr__(self, name):
        return _MultiCallMethod(self.__call_list, name)

    def __call__(self):
        marshalled_list = []
        for name, args in self.__call_list:
            marshalled_list.append({'methodName' : name, 'params' : args})

        return MultiCallIterator(self.__server.system.multicall(marshalled_list))

Но повторить это в нужной мне форме не получилось. Мне даже понять не удалось. Кто-нибудь объяснит?

Это сообщение отредактировал(а) PyAlexey - 2.10.2006, 19:15
PM   Вверх
proDiva
Дата 2.10.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(PyAlexey @  2.10.2006,  19:13 Найти цитируемый пост)
Но повторить это в нужной мне форме не получилось. Мне даже понять не удалось. Кто-нибудь объяснит?

PyAlexey, я не знаю, как объяснить, потому что не знаю))))
Cr@$h, но я хочу + за отзывчивость)))))

Парни, извините, за несерьезное настроение..... я шучу)))
Просто на работе у меня сегодня была такая напряженка, а в Вашей компании я расслабляюсь. Поэтому не судите строго за мой флуд smile 
PM MAIL ICQ   Вверх
Cr@$h
Дата 2.10.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Цитата(proDiva @  2.10.2006,  20:35 Найти цитируемый пост)
Cr@$h, но я хочу + за отзывчивость)))))

Конечно. ++, но за разряжение обстановки своим обществом.  smile 
PM MAIL ICQ   Вверх
proDiva
Дата 2.10.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 19.9.2006
Где: КЧР, Россия

Репутация: 7
Всего: 7



Цитата(Cr@$h @  2.10.2006,  19:40 Найти цитируемый пост)
Конечно. ++, но за разряжение обстановки своим обществом.

Ну вот, выпросила))) Спасибо за щедрость smile 

PM MAIL ICQ   Вверх
J2A
Дата 2.10.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Операция "точка" -- это __getattr__, операция "вызов" -- это __call__. Из этих данных следует, что если хочешь реализовать

bar.foo1.foo2.foo3.fun()

то нужно чтобы каждый __getattr__ возвращал объекты, имеющие как __call__, так и новый __getattr__.

В данном коде _MultiCallMethod и реализуют такой "хитрый" объект. В "магию" с __call_list я не углублялся... но на первый взгляд при __call__ имя вызова и параметры добавляются в "очередь" но не выполняются.

MultiCallIterator выполняет служебные функции - обходит "очередь" результатов вызовов и смотри корректно/некорректно завершились вызовы.

А уж MultiCall связывает всё воедино.

Вообще, более явный пример -- это ProxyServer и _Method. Упрощенно выглядит так:
Код

class VirtualMethod(object):
    def __init__(self, ex, name):
        self.__exec = ex
        self.__name = name

    def __getattr__(self, name):
        return VirtualMethod(self.__exec, "%s.%s" % (self.__name, name))

    def __call__(self, *args):
        return self.__exec(self.__name, args)

class MegaCaller(object):
    def __executor(self, methodname, params):
        print "we exec %s %s" % (methodname, str(params))

    def __getattr__(self, name):
        return VirtualMethod(self.__executor, name)

if __name__ == '__main__':
    mc = MegaCaller()
    mc.foo1.foo2.foo3.foo4.foo5.fun()

--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
PyAlexey
Дата 2.10.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 19.9.2006
Где: Россия, Нижний Но вгород

Репутация: 6
Всего: 7



J2A, спасибо, завтра попробую смастачить.

Это сообщение отредактировал(а) PyAlexey - 2.10.2006, 20:25
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.