【发布时间】:2017-04-20 18:28:08
【问题描述】:
我的问题与this one 非常相似,但在我的情况下,当在包中使用它们时,接受的答案并没有修饰包中的所有功能,我不知道为什么。
例如,我有一个这样的项目:
project/
package/
__init__.py
module_a.py
module_b.py
main.py
__init__.py
from .module_a import *
from .module_b import *
import types
# This is the decorator that will be used
from functools import lru_cache
for name, obj in list(globals().items()):
if isinstance(obj, types.FunctionType):
globals()[name] = lru_cache(maxsize=100)(obj)
module_a.py
from .module_b import b
def a(arg):
return b
module_b.py
def b(arg):
return arg
main.py
import package
print(package.a.cache_info())
print(package.a(None).cache_info())
print(package.b.cache_info())
当包被导入时,__init__.py 装饰globals 中的函数在单步执行代码时就可以了。但是,如果我执行 main.py 我会收到以下错误:
C:\Users\pbreach\Anaconda3\python.exe C:/Users/pbreach/PycharmProjects/project/main.py
Traceback (most recent call last):
CacheInfo(hits=0, misses=0, maxsize=100, currsize=0)
File "C:/Users/pbreach/PycharmProjects/project/main.py", line 4, in <module>
print(package.a(None).cache_info())
AttributeError: 'function' object has no attribute 'cache_info'
这意味着b 在从module_b 导入到module_a 时不会被修饰。
为什么这只发生在第二行?有什么方法可以做到这一点?
我可以在__init__.py 或main.py 的导入期间进行装饰,但我宁愿不必在package 的每个模块中应用装饰器,因为在我的情况下有很多.
编辑:
我认为问题是因为__init__.py 中的globals 与将b 导入module_a 时的命名空间不同,这意味着同一函数有两个不同的实例。有没有办法解决这个问题?
【问题讨论】:
标签: python python-3.x python-import memoization python-decorators