gpt4 book ai didi

python - 包装使用 import * 导入的函数?

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:14 25 4
gpt4 key购买 nike

我有一组测试,其中包装了特定模块的一些功能,假设它看起来像这样:alpha.py

def foo(): 
return 'foo'
def bar():
return foo(), 'bar'

debug_alpha.py

from alpha import *
def _wrapper(func):
def call(*args, **kwargs):
print('entering')
result = func(*args, **kwargs)
print('exiting')
return result
return call

def _wrapFunc(module, func):
module.__dict__[func.__name__] = _wrapper(func)

test.py

import debug_alpha
debug_alpha._wrapFunc(debug_alpha, debug_alpha.foo)
print(debug_alpha.foo())
print(debug_alpha.bar())

但是输出当然只是:

entering
exiting
foo
('foo', 'bar')

因为虽然 foo 函数可能已被包装 - bar 仍然引用原始 alpha< 中的 foo 函数 模块。是否有一个技巧可以以 bar 也将调用适当的 foo 而不更改导入架构的方式包装 foo

最佳答案

我不完全确定您的目标,但您可以执行类似于以下操作的操作:

alpha.py

# everything here is the same
def foo():
return 'foo'

def bar():
return foo(), 'bar'

debug.py 使用inspect module查找定义该函数的原始模块。

# make the debug module reusable
import inspect

def _wrapper(func):
def call(*args, **kwargs):
print('entering')
result = func(*args, **kwargs)
print('exiting')
return result
return call


def _wrapFunc(func):
# find out which module the original function was
# declared and wrap it.
module = inspect.getmodule(func)
wrapped = _wrapper(func)
setattr(module, func.__name__, wrapped)
# return the wrapped function so that the module
# that called this function can have access to the
# newly created function
return wrapped

test_alpha.py

# make test.py the testing script instead of depending on
# debug_alpha to handle hardcoded namespaces
import debug_alpha
from alpha import *

# wrap the function in its original module
# and override the wrapped function in this namespace
foo = debug_alpha._wrapFunc(foo)

print(foo())
print(bar())

输出

entering
exiting
foo
entering
exiting
('foo', 'bar')

关于python - 包装使用 import * 导入的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29054442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com