Hy语言中带:async、装饰器的defn如何正确添加类型标注?
Hy中带:async修饰器/装饰器的defn参数类型标注报错的解决方法
问题现象
按照Hy官方文档的defn语法规范,在使用:async修饰器或自定义装饰器的函数定义中,不添加:tp参数类型标注时,异步功能、装饰器逻辑以及返回类型标注都能正常工作。但尝试用:tp语法标注参数类型时,会直接触发HySyntaxError语法错误。
错误示例
以下代码会触发报错:
(defn :async :tp [x int] -> str (await (some-async-task x)) (str x))
最小复现案例
简化后的复现代码:
(defn :async :tp [a int] -> bool (await (async.sleep 1)) (> a 0))
执行上述代码时,Hy解释器会抛出HySyntaxError,提示语法不符合规范。
可行解决方案
放弃使用:tp语法,改为直接在参数前通过#^类型的方式标注参数类型。调整后的代码示例:
(defn :async [#^int a] -> bool (await (async.sleep 1)) (> a 0))
该写法可以正常被Hy编译为对应的Python代码,生成的代码如下:
import asyncio async def func(a: int) -> bool: await asyncio.sleep(1) return a > 0
内容的提问来源于stack exchange,提问作者Takis
相关产品推荐
相关产品推荐

