问题描述
我定义了两个宏:
(defmacro property [name type]
`(setv ^(of Optional ~type) ~name None))
(defmacro data-type [vname &rest propertys]
`(with-decorator dataclass
(defclass ~vname []
~propertys)))
当被称为:
(data-type my-test-type
(property name str)
(property unitprice float)
(property qty_on_hand int)
(property test int))
并扩展并翻译成python,它产生以下内容:
@dataclass
class my_test_type:
name: Optional[str] = None
unitprice: Optional[float] = None
qty_on_hand: Optional[int] = None
test: Optional[int] = None
[None,None,None]
在没有嵌套宏的情况下编写它仍然会产生一个 None 的列表:
(data-type my-test-type
(setv ^(of Optional str) name None
^(of Optional float) unitprice None
^(of Optional int) qty_on_hand None
^(of Optional int) test None))
@dataclass
class my_test_type:
name: Optional[str] = None
unitprice: Optional[float] = None
qty_on_hand: Optional[int] = None
test: Optional[int] = None
[None]
这个 [None,None]
列表来自哪里?虽然 none 列表不会破坏任何东西,但它仍然有点刺耳,我希望我知道编写此宏以避免出现 None 列表的更好方法是什么。
解决方法
看起来你写的是~propertys
,但意思是~@propertys
。您希望将每个属性声明拼接到 defclass
中,而不是将它们组合成一个列表。进行此更改会删除 None
的尾随列表。