在Python中使用自定义文档字符串的方法和属性别名 [英] Method and property aliases with custom docstring in Python

查看:0
本文介绍了在Python中使用自定义文档字符串的方法和属性别名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实现了以下修饰符:

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)
# ...

现在我正在打包我的项目并构建文档。目前,别名方法和属性"继承"原始实体的相同文档字符串。我想知道是否有可能在装饰器级操作别名实体的文档字符串,使它们看起来像:

此方法/属性是X的别名。

推荐答案

您可以直接操作X.__doc__,例如:

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.

这篇关于在Python中使用自定义文档字符串的方法和属性别名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆