"""
TestSpec — 统一的算子测试规范
不依赖任何测试框架或工具。每个 API/算子 一个 TestSpec 类,所有测试规范要素作为可选属性定义。
约定速查:
class AbsTestSpec:
'''Abs 算子测试规范'''
# golden — CPU 真值(可选):字符串 / 函数 / 类
golden = "numpy.abs"
# third_party — 三方标杆(可选):字符串 / dict / 类
third_party = {"torch": "torch.abs", "tf": "tf.raw_ops.Abs"}
# tolerance — 精度标准(可选;abs 精确运算,二进制一致)
tolerance = {
"float32": {"standard": "binary_equal"},
}
# compare / pre_compare / customize_inputs 未定义 → 框架用默认
# __spec__ dict 注册(可选,命名约定兜底);值为类名字符串(非类对象)——
# loader AST 扫描不 exec、spec 隔离 + 惰性 load;可写文件顶部
__spec__ = {"abs": "AbsTestSpec"}
类名约定(__spec__ 不存在时回退):
op_name: softmax_v2 → SoftmaxV2TestSpec
op_name: abs → AbsTestSpec
发现机制:loader 首次 load 时 AST 静态建索引(扫描不 exec),惰性 load 仅 exec
命中的那一个文件;__spec__ 因 AST 扫描而可写文件顶部。完整约定见 README.md。
"""
__all__ = ["SpecNotFoundError", "InvalidSpecError", "validate", "get_spec_attr", "get_spec_class_meta"]
class SpecNotFoundError(Exception):
"""找不到规范类"""
pass
class InvalidSpecError(Exception):
"""属性类型不符合约定,validate 失败时抛出(fail-fast)"""
pass
def __getattr__(name):
if name == "get_spec_attr":
from .manager import get_spec_attr
return get_spec_attr
if name == "get_spec_class_meta":
from .manager import get_spec_class_meta
return get_spec_class_meta
if name == "validate":
from .validator import validate
return validate
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")