Как перенаправить вызовы функций на целевую функцию с тем же именем, но в другом контекстеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как перенаправить вызовы функций на целевую функцию с тем же именем, но в другом контексте

Сообщение Anonymous »

Работает:

Код: Выделить всё

import multiprocessing
from time import sleep

class bar():
def __init__(self): pass

def x(self, a, b): print(self, a, b)

def y(self, a, b=None, c=None): print(self, c, b, a)

def phandler(ops):
hbar = bar()
while True:
fname, args, kwargs = ops.get()
fn = eval("hbar." + fname)
fn(*args, **kwargs)

def x(*args, **kwargs): ops.put(["x", args, kwargs])

def y(*args, **kwargs): ops.put(["y", args, kwargs])

if __name__ == "__main__":
ops = multiprocessing.Manager().Queue()
multiprocessing.Process(target=phandler, args=(ops,)).start()
x(1, 2)
y(1, c=2)
sleep(1)  # or any other way to wait for the functions to finish execution
Недостаток: требуется одна функция в основном контексте на каждую функцию во внешнем классе в другом процессе.
Как видите, код x() и y() в основном контексте практически идентичны. Разве это не требует некоторой оптимизации? Я имею в виду своего рода функцию «диспетчера», которую можно вызывать под разными именами, примерно так:

Код: Выделить всё

def dispatch(*args, **kwargs): ops.put([__name__, args, kwargs])
x = y = dispatch
Но мои исследования на данный момент столкнулись с двумя основными проблемами:
  • Да, имя< /strong> не работает (это просто заполнитель), но я не смог найти другого метода, который возвращал бы «x» или «y», а не всегда просто «отправку».
    < /li>
    Вместо определения нескольких функций теперь мне нужно определить несколько псевдонимов для функции-диспетчера, что тоже неоптимально.
Есть идеи, как это работает в самом общем виде?

Подробнее здесь: https://stackoverflow.com/questions/787 ... -different
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»