Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中带有自定义docstring的方法和属性别名_Python_Python 3.x_Decorator_Alias_Docstring - Fatal编程技术网

Python中带有自定义docstring的方法和属性别名

Python中带有自定义docstring的方法和属性别名,python,python-3.x,decorator,alias,docstring,Python,Python 3.x,Decorator,Alias,Docstring,我已经实现了以下装饰器: class alias(object): """ A decorator for implementing method aliases. """ def __init__(self, *aliases): self.aliases = set(aliases) def __call__(self, obj): if type(obj) == property: o

我已经实现了以下装饰器:

class alias(object):

    """
    A decorator for implementing method aliases.
    """

    def __init__(self, *aliases):

        self.aliases = set(aliases)

    def __call__(self, obj):

        if type(obj) == property:
            obj.fget._aliases = self.aliases
        else:
            obj._aliases = self.aliases

        return obj

def aliased(aliased_class):

    """
    A decorator for enabling method aliases.
    """

    aliased_class_dict = aliased_class.__dict__.copy()
    aliased_class_set = set(aliased_class_dict)

    for name, method in aliased_class_dict.items():

        aliases = None

        if (type(method) == property) and hasattr(method.fget, '_aliases'):
            aliases = method.fget._aliases
        elif hasattr(method, '_aliases'):
            aliases = method._aliases

        if aliases:

            for a in aliases - aliased_class_set:
                setattr(aliased_class, a, method)

    return aliased_class
下面是我如何使用它们来创建属性和方法的可调用别名的示例:

@aliased
class MyClass(object):

    @alias('a')
    @property
    def alpha(self) -> float:

        """
        Returns the value of alpha.
        """

        return 2.5

    @alias('agt')
    def alpha_greater_than(value) -> bool:

        """
        Checks whether alpha is greater than the given value.
        """

        return self.alpha > value

mc = MyClass()
result = mc.agt(3.0)
# ...
现在我正在打包我的项目并构建文档。目前,别名方法和属性“继承”原始实体的同一docstring。我想知道是否有可能在装饰器级别操纵别名实体的docstring,使它们看起来像:

此方法/属性是X的别名


您可以直接操作
X.\uuuuu doc\uuuuu
,例如:

if aliases:

    for a in aliases - aliased_class_set:
        method.__doc__ = "This function is an alias of %s." % a
        setattr(aliased_class, a, method)
但问题是原始参考
X
也会受到影响。因此,您最好使用包装器:

def aliased(aliased_class):

    """
    A decorator for enabling method aliases.
    """
    def wrapper(func):
        @functools.wraps(func)
        def inner(*args, **kwargs):
            return func(*args, **kwargs)
        return inner

    aliased_class_dict = aliased_class.__dict__.copy()
    aliased_class_set = set(aliased_class_dict)

    for name, method in aliased_class_dict.items():

        aliases = None

        if (type(method) == property) and hasattr(method.fget, '_aliases'):
            aliases = method.fget._aliases
        elif hasattr(method, '_aliases'):
            aliases = method._aliases

        if aliases:

            for a in aliases - aliased_class_set:
                wrapped_method = wrapper(method)
                wrapped_method.__doc__ = "This function is an alias of %s." % a
                setattr(aliased_class, a, wrapped_method)

    return aliased_class
和测试:

print(mc.alpha_greater_than.__doc__)
print(mc.agt.__doc__)
输出:

        Checks whether alpha is greater than the given value.

This function is an alias of agt.

除了在Sphinx文档中,别名实体丢失了它们的签名ant类型提示之外,这就像一个符咒。例如,“agt(value)->bool”变为“agt(**kwargs)”。有什么办法保存它吗?我没有测试过,但我相信有。我将修改我的答案以使用
functools.wrapps
@TommasoBelluzzo我已检查
functools.wrapps
是否工作正常:)查看我的更新。