Изменение функционального модуля - PullRequest
0 голосов
/ 16 июля 2011

У меня есть 2 модуля A и B. модуль A не имеет ничего внутри, а модуль B имеет функцию «F» Я хочу назначить функцию 'f' для модуля A, но я хочу переопределить эту функцию globals , потому что я хочу, чтобы эта функция использовала переменные модуля A.

Но там у меня есть некоторые проблемы. с этим простым кодом:

print A
print B
print '---'
from copy import deepcopy 
setattr(A, 'f', deepcopy(B.f))
A.f.__module__ = A
A.f.__globals__['__name__'] = 'A'
print A
print B

У меня следующий результат:

<module 'A' from '<path>/A/__init__.pyc'>
<module 'B' from '<path>/B/__init__.pyc'>
---
<module 'A' from '<path>/A/__init__.pyc'>
<module 'A' from '<path>/B/__init__.pyc'>

Почему имя модуля меняется, когда я меняю только одну из функций globals key и как я могу предотвратить это?

1 Ответ

1 голос
/ 16 июля 2011

Вы можете попробовать использовать functools.update_wrapper:

A.f = functools.update_wrapper(wrapper=B.f, wrapped=A.f)

Это изменит B.f, хотя (заставляя принимать аспекты A.f, __module__, __name__ и __doc__, см. functools исходный код модуля).Поскольку вы действительно не сказали, чего пытаетесь достичь (а не как пытаетесь это сделать), я действительно не могу сказать, хотите ли вы этого или нет.

...