python3/hy - 使用 hy.eval 时,不共享导入和全局变量

python3/hy - When using hy.eval, imports and globals are not shared

我了解如何使用 python 中的 hy.read_strhy.eval 来计算 python 中的 hy 表达式。但是,当我使用这种方法时,导入和全局变量不会在 hypython 环境之间共享。考虑这个例子:

import hy
def hyeval(x=None):
    if x is None:
        return None
    try:
        return hy.eval(hy.read_str(str(x)))
    except Exception as e:
        print('!!! exception: {}'.format(e))
        return None
import datetime  # this is ignored within `hyeval` calls
now = hyeval('((. datetime datetime now))')
print('result: {}'.format(now))

这会打印...

!!! exception: name 'datetime' is not defined
result: None

即使我执行以下操作,它也会生成相同的异常...

... etc. ...
hyeval('(import datetime)')
now = hyeval('((. datetime datetime now))')
print('result: {}'.format(now))

我必须在字符串中显式导入 datetime 传递给我的 hyeval 函数 ...

... etc. ...
now = hyeval('((do (import datetime) (. datetime datetime now)))')
print('result: {}'.format(now))

这会正确打印以下内容...

result: 2017-09-22 09:41:49.771139

如果我通过字符串重新调用 ((. datetime datetime now)) 调用,我必须通过 (do ...) 块不断重复 (import datetime) 调用。

在从 python 中调用 hy 字符串时,有什么方法可以在对 hy.read_str/hy.eval 的连续调用之间记住导入和全局变量,或者 python 全局变量通过 hy?

调用字符串时可以识别导入

我想通了:如果 hy.eval 的第二个参数是 globals(),则 python 环境的全局变量和导入在执行 hy 字符串评估时可用。 ..

import hy
def hyeval(x=None, g=None):
    if x is None:
        return None
    try:
        if not g:
            g = globals()
        return hy.eval(hy.read_str(str(x)), g)
    except Exception as e:
        print('!!! exception: {}'.format(e))
        return None
import datetime
now = hyeval('((. datetime datetime now))')
print('result: {}'.format(now))

这会正确打印以下内容...

result: 2017-09-22 10:25:36.752656