【发布时间】:2021-09-20 23:38:49
【问题描述】:
我正在编写一个用于与数据集交互的包,并且代码看起来像
from abc import ABC, ABCMeta, abstractmethod
from functools import cache
from pathlib import Path
from warnings import warn
class DatasetMetaClass(ABCMeta):
r"""Meta Class for Datasets"""
@property
@cache
def metaclass_property(cls):
r"""Compute an expensive property (for example: dataset statistics)."""
warn("Caching metaclass property...")
return "result"
# def __dir__(cls):
# return list(super().__dir__()) + ['metaclass_property']
class DatasetBaseClass(metaclass=DatasetMetaClass):
r"""Base Class for datasets that all datasets must subclass"""
@classmethod
@property
@cache
def baseclass_property(cls):
r"""Compute an expensive property (for example: dataset statistics)."""
warn("Caching baseclass property...")
return "result"
class DatasetExampleClass(DatasetBaseClass, metaclass=DatasetMetaClass):
r"""Some Dataset Example."""
现在,问题是在make html 期间,sphinx 实际上执行了baseclass_property,这是一个非常昂贵的操作。 (除其他外:检查数据集是否在本地存在,如果不存在,则下载它、对其进行预处理、计算数据集统计数据、修剪草坪并取出垃圾。)
我注意到,如果我将其设为 MetaClass 属性,则不会发生这种情况,因为 meta-class property does not appear in the classes __dir__ call 可能是也可能不是错误。通过取消注释这两行手动将其添加到 __dir__ 会导致 sphinx 也处理元类属性。
问题:
- 这是 Sphinx 中的错误吗?鉴于
@properties通常处理得很好,它似乎无意间因@classmethod@property而中断。 - 目前最好的选择是什么来避免这个问题?我可以以某种方式告诉 Sphinx 不解析此函数吗?我希望有可能通过类似于
# noqa、# type: ignore、# pylint disable=等的评论或通过某种@nodoc装饰器禁用 sphinx。
【问题讨论】:
标签: python properties python-sphinx metaclass python-3.9