我有一个由Sphinx和ReadTheDocs自动记录的项目。有些方法使用了我定义的装饰器。使用此修饰符会使自动文档显示通用签名,例如my_func(*args, **kwargs)
为了保留签名,我使用了decorator
模块。我不希望我的项目依赖于该模块,我仅将其用于ReadTheDocs.org完成的文档生成。我的文档requirements.txt包含装饰器。
所以,我的问题是这个。装饰器应该返回一个函数,当我使用@decorator时,我的装饰器似乎期望我返回该函数的结果。这种行为上的差异使我无法使我的项目不依赖装饰器模块,但仍保留了Sphinx的签名。
这是我的cde,单看可能更清楚。
try:
from decorator import decorator
except ImportError:
def decorator(f):
return f
@decorator
def my_decorator(func, *args, **kwargs):
def decorated(*args, **kwargs):
return func(*args, **kwargs)
decorated._some_property = 'foo'
return decorated
@my_decorator
def some_func(self, a, b):
return 123
当我没有安装decorator
软件包并且Sphinx能够读取some_func
的签名时,上面的代码有效。当我安装了decorator
软件包时,我的代码失败了,并且some_func
返回了一个函数而不是123。
现在,我可以将装饰器更改为return func(*args, **kwargs)
,但这意味着decorator
模块现在是我的项目的必需条件。
我也尝试过:
_DECORATOR_MODULE_LOADED = False
try:
from decorator import decorator
_DECORATOR_MODULE_LOADED = True
except ImportError:
def decorator(f):
return f
#...
#...
if _DECORATOR_MODULE_LOADED:
return decorated(*args, **kwargs)
else:
return decorated
可以使用,但是现在我无法访问some_func._some_property
我该怎么办? 谢谢