繁体   English   中英

如何在 Python 3.9 / 3.10 中记录 Classmethod 属性?

[英]How to Document Classmethod Properties in Python 3.9 / 3.10?

python 3.9的一个小附加组件是

在 3.9 版更改: 类方法现在可以包装其他描述符,例如 property()。

这在多种情况下很有用,例如作为在 classmethods 上使用 property()的解决方案,或者为了通过配方创建本质上是延迟评估的类属性

class A:
   @classmethod
   @property
   @cache
   def lazy_class_attribute(cls):
       """Method docstring."""
       return expensive_computation(cls)

这种运作良好,并罚款蟒之内,进口类,实例化它或它的子类,不会造成expensive_computation发生,但似乎双方pydocsphinx不仅会造成执行expensive_computation ,当他们试图获得的文档字符串,但不显示这个@classmethod任何文档字符串。

问题:是否有可能 - 从 python (*) 内部 - 懒惰地评估在构建文档时不会执行的类属性/属性?

(*) 在Stop Sphinx from Executing a cached classmethod property 中提出的一种解决方法,感谢 /u/jsbueno,包括根据环境变量修改函数体:

def lazy_class_attribute(cls):
   """Method docstring."""
    if os.environ.get("GENERATING_DOCS", False):
        return
   return expensive_computation(cls)

我非常喜欢这种解决方法,因为特别是它允许人们在记录时呈现不同的输出。 (例如,我的类具有基于类名的路径属性。如果不同的用户执行相同的脚本,路径将不同,因为他们的主文件夹不同。)

但是有两个问题:

  1. 这种方法取决于在 python 之外做的事情,imo,在理想的世界中,不需要在 python 本身之外做
  2. 为了在文档中获取文档字符串,似乎我们最终不得不做一些不直观的事情,比如
class MetaClass:
    @property
    @cache
    def _expensive_function(cls):
        """some expensive function"""

class BaseClass(metaclass=MetaClass):
    lazy_attribute: type = classmethod(MetaClass._expensive_funcion)
    """lazy_attribute docstring"""

在此处输入图片说明

PS:顺便说一下, @classmethod@propertyattribute之间有什么功能区别吗? 他们看起来非常相似。 我目前唯一能看出的区别是,如果该属性需要访问其他@classmethod ,我们需要像上面一样移动元类中的所有内容。

本文暂无回复,试试以下方法:

如何在 Python 3.9 / 3.10 中记录 Classmethod 属性?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM