[英]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
发生,但似乎双方pydoc
和sphinx
不仅会造成执行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)
我非常喜欢这种解决方法,因为特别是它允许人们在记录时呈现不同的输出。 (例如,我的类具有基于类名的路径属性。如果不同的用户执行相同的脚本,路径将不同,因为他们的主文件夹不同。)
但是有两个问题:
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@property
和attribute
之间有什么功能区别吗? 他们看起来非常相似。 我目前唯一能看出的区别是,如果该属性需要访问其他@classmethod
,我们需要像上面一样移动元类中的所有内容。
本文暂无回复,试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.