【问题标题】:How to write a macro like dot(.) operator in hylang?如何在 hylang 中编写像点(。)运算符这样的宏?
【发布时间】:2021-07-27 06:23:59
【问题描述】:

我们有一些异步属性(使用@property)和一些常用的。我们必须使用 hy 来检查一个是否是异步的,或者不使用 asyncio.iscoroutine 函数。问题是我们必须使用 getattr 而不是 。运算符,因为 dot 将调用属性内部函数。我们希望在不破坏其他项目中使用的 DSL 的情况下更改我们的 hy 代码,也就是说,我们不想对属性名称使用字符串表示法(双引号),因此我们需要编写一些像 .但在内部调用 getattr。

=> (defmacro attr [obj attr] `(getattr ~obj '~attr))
=> (attr 5 real)
Traceback (most recent call last):
  File "stdin-5bbedde10a6366314d9be4bd343639582b4d0748", line 1, in <module>
    (attr 5 real)
AttributeError: 'int' object has no attribute 'real'
=> (. 5 real)
5

【问题讨论】:

  • 等效的 defmacro 在 Hissp 中运行良好。您可能需要将 attr 转换为字符串以使其在 Hy 中工作,而不仅仅是引用它。符号与 Hy 中的字符串不同。
  • Hy 的确切版本是什么?最近变化很大,所以我们想在同一个版本上进行测试。
  • @gilch 我们使用的是 hy 1.0.a3,我们不能在宏参数中使用字符串,因为我们希望保持与其他代码的兼容性,使用这个宏来处理非异步代码。

标签: async-await macros python-asyncio hy


【解决方案1】:

听起来您对 Python 属性的语义感到困惑,这是可以理解的,因为它们相当多毛。在 Python 中(因此在 Hy 中也适用于等价结构),foo.xgetattr(foo, "x") 总是等价的,即使 x 是一个属性。要将属性方法作为对象而不是调用它,您需要检索类的属性 (type(x)) 而不是实例,并且带有字符串文字的 getattr. 仍然可以互换。在this example中,getattr(type(foo), 'bar').fset也可以写成type(foo).bar.fset

【讨论】:

    【解决方案2】:

    我试过了

    (defmacro attr [obj attr]
      `(getattr ~obj ~(str attr)))
    
    (print (attr 5 real))
    

    web interpreter 中,它会打印5

    我无法在网络解释器中重现您的问题。它必须仍在运行旧版本,因为我必须安装您的确切版本才能做到这一点。我怀疑以下 breaking change 宣布为 1.0a2 解释了差异:

    Hy 模型对象不再等于普通的 Python 值。为了 例如,(!= 1 '1)。您可以使用hy.as-model 将值提升到模型 在进行此类检查之前。

    我的attr 版本确实适用于Hy 1.0a3。我检查了。试试看。

    Python 中的属性使用字符串键存储在对象的.__dict__ 中。由于 Hy 的符号不再等于字符串,因此使用符号查找字符串键将始终失败。将符号转换为字符串首先修复它。我最初的评论是正确的。 (而且这一步在 Hissp 中是不必要的,因为它缺少 Hy 的单独模型类型。)

    【讨论】:

    • 哎呀,我不是故意把那句话留在那里。天色已晚。 @Kamyar 试试这个版本。
    【解决方案3】:

    虽然后一个答案有效,但我发现问题在于获取属性背后的方法,正如@kodiologist 所写,getattr 和 dot 是等价的。所以我使用了 fget 和:

    (iscoroutinefunction (.fget (. (type obj) ~attr)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2010-09-22
      • 2013-10-29
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多