python保留签名的装饰器不会返回func

时间:2018-08-30 03:17:53

标签: python decorator python-sphinx

我有一个由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

我该怎么办? 谢谢

0 个答案:

没有答案