1

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

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)),我必须继续(import datetime)通过(do ...)块重复调用。

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

4

1 回答 1

3

我想通了:如果第二个参数hy.evalglobals(),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
于 2017-09-22T14:29:56.650 回答