宏内部的宏创建一个 None 列表

问题描述

我定义了两个宏:

(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 的尾随列表。