【问题标题】:Is there a way to capture a name from the environment when using hy.eval?使用 hy.eval 时,有没有办法从环境中捕获名称?
【发布时间】:2020-05-27 13:45:01
【问题描述】:

我正在尝试在 hylang 中创建函数并从 python 中使用它们,但创建的函数似乎无法访问传递给 hy.eval 的环境。

import hy

env = dict(x=5)
func = hy.eval(hy.read_str('(fn [] x)'), env)
print(func())

func 的调用导致NameError: name 'x' is not defined。我也试过了

hy.eval(hy.read_str('(func)'), env)

没有运气(同样的错误)。有什么想法吗?

【问题讨论】:

    标签: hy


    【解决方案1】:

    hy.eval的第一个参数是locals,而不是Python的evalglobals。但是,隐式使用调用环境可以正常工作,因此您可以更直接地将其编写为

     import hy
    
     x = 5
     func = hy.eval(hy.read_str('(fn [] x)'))
     print(func())
    

    【讨论】:

    • 实现全局变量需要什么?我使用调用环境的问题是 1) 我要传递的环境很大 2) 环境动态变化 3) 相同的环境被不同位置的多个 hy.eval 调用重用 4) 存储创建的函数并稍后从其他地方调用。
    • 如果 x 在 fn 中被标记为非本地,会被捕获吗?
    • @Kris 制作一个模块对象,就像您自己的答案一样,可能是最简单的方法,因为 hy.eval 目前已实现。
    【解决方案2】:

    hy.eval 没有globals 参数,但它有一个module 参数,通过查看源代码,我发现module.__dict__globals 的形式传递给eval。所以以下工作:

    import hy
    from types import ModuleType
    
    env = dict(x=5)
    module = ModuleType('<string>')
    module.__dict__.update(env)
    func = hy.eval(hy.read_str('(fn [] x)'), module=module)
    print(func())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多