Найти - Пользователи
Полная версия: Можно ли вызвать из скрипта функцию не импортируя его?
Начало » Python для экспертов » Можно ли вызвать из скрипта функцию не импортируя его?
1 2
QZip
1скрипт передает второму(импортированному) имя функции.
2скрипт вызывает функцию первого(не импортированного) скрипта

Можно ли сделать что-то типа того?

Если нет, то как например сделали в PyGTK ( gtk.Button(“кнопка”,callback()) )
j2a
уверен, что в pygtk передается имя функции, а не сама функция?
QZip
я ни в чем не уверен.
Всмысле сама функция?
Вырезается кусок скрипта с функцией и передается?
А как же глобалы, импорты и прочие?
poltergeist
Конечно можно, в питоне и не такая камасутра проходит, тока нельзя этим злоупотреблять, только если по другому нельзя или задача специфическая.

Вы лучше скажите в чём конкретно проблема с конкретными примерами, которые нужно поправить, а то не понятно что нужно в результате.
QZip
да, по другому нельзя и задача специфическая

Как?

А править вобщем нечего т.к. неясен принцип.
cybergrind
хез конечно что имел ввиду полтергейст… разве что распарсить файл, и скомпилить его самому :/ да и то, возможно ли… можно запустить через execfile, но это непозволит юзать функцию.
я вообще неочень представляю ситуацию, где реально нельзя импортировать скрипт… разве что корявый скрипт, который выдает ошибку при попытке импорта
tabajara
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
Вот моё ХЗ (понимание вопроса):

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
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
Код poltergeist'а действительно работает.
Все гениальное просто.

2 tabajara, ZAN,
маленько не то.

Всем спасибо.
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