QZip
Фев. 5, 2008 17:55:34
1скрипт передает второму(импортированному) имя функции.
2скрипт вызывает функцию первого(не импортированного) скрипта
Можно ли сделать что-то типа того?
Если нет, то как например сделали в PyGTK ( gtk.Button(“кнопка”,callback()) )
j2a
Фев. 5, 2008 18:07:25
уверен, что в pygtk передается имя функции, а не сама функция?
QZip
Фев. 5, 2008 18:17:07
я ни в чем не уверен.
Всмысле сама функция?
Вырезается кусок скрипта с функцией и передается?
А как же глобалы, импорты и прочие?
poltergeist
Фев. 5, 2008 18:27:23
Конечно можно, в питоне и не такая камасутра проходит, тока нельзя этим злоупотреблять, только если по другому нельзя или задача специфическая.
Вы лучше скажите в чём конкретно проблема с конкретными примерами, которые нужно поправить, а то не понятно что нужно в результате.
QZip
Фев. 5, 2008 18:46:39
да, по другому нельзя и задача специфическая
Как?
А править вобщем нечего т.к. неясен принцип.
cybergrind
Фев. 5, 2008 20:17:03
хез конечно что имел ввиду полтергейст… разве что распарсить файл, и скомпилить его самому :/ да и то, возможно ли… можно запустить через execfile, но это непозволит юзать функцию.
я вообще неочень представляю ситуацию, где реально нельзя импортировать скрипт… разве что корявый скрипт, который выдает ошибку при попытке импорта
tabajara
Фев. 5, 2008 20:58:31
QZip
Можно ли вызвать из скрипта функцию не импортируя его?
Hi, хіба шось типу такого:
#dont_import.py
import sys, os
print "You import me!!!"
def needed_func(a):
return a + 2
#main.py
import new
dont_import_module = open("dont_import.py", "r")
source = dont_import_module.read()
dont_import_module.close()
co = compile(source, "dont_import.py", "exec")
nf = new.function(co.co_consts[list(co.co_names).index("needed_func")], globals())
print nf(10)
poltergeist
Фев. 5, 2008 21:07:44
Вот моё ХЗ (понимание вопроса):
file1: script1.py
import script2
print ‘——————— basic ————————-’
def callback(): print ‘my implementation’
script2.myProcedureWithCallback('arg1_value', ‘arg2_value’, callback)
print ‘——————– no hack ————————’
script2.myProcedureWithHack('arg1_value', ‘arg2_value’)
print ‘——————- with hack ———————–’
script2.int_callback = callback
script2.myProcedureWithHack('arg1_value', ‘arg2_value’)
file2: script2.py
import inspect
def int_callback(): print ‘original implementation’
def myProcedureWithCallback(arg1, arg2, callback=None):
print arg1, arg2, callback
#
if callback and inspect.isfunction(callback):
try: result = callback()
except Exception, msg: print msg
else: return result
def myProcedureWithHack(arg1, arg2):
print arg1, arg2, int_callback
#
return int_callback()
ZAN
Фев. 6, 2008 11:45:11
cybergrind
хез конечно что имел ввиду полтергейст… разве что распарсить файл, и скомпилить его самому :/ да и то, возможно ли… можно запустить через execfile, но это непозволит юзать функцию.
я вообще неочень представляю ситуацию, где реально нельзя импортировать скрипт… разве что корявый скрипт, который выдает ошибку при попытке импорта
Кирилл, а с чего бы это нельзя использовать execfile?
Скрипт a.py:
#!/usr/bin/env python
def fun(arg):
print arg
scope = {'function': fun}
execfile('b.py', scope)
скрипт b.py
#!/usr/bin/env python
function(3)
zan@alex> ./a.py
3
Просто выполняем скрипт b.py в нужном scope (выполняет роль globals) - переменной function приклеивается ссылка на функцию “fun”, которую и вызываем во втором скрипте без импорта.
QZip
Фев. 6, 2008 15:26:58
Код poltergeist'а действительно работает.
Все гениальное просто.
2 tabajara, ZAN,
маленько не то.
Всем спасибо.