gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:34:51 38 4
gpt4 key购买 nike

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

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 ...) 调用 block 。

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

最佳答案

我发现:如果 hy.eval 的第二个参数是 globals(),则在执行 hy 时,Python 环境的全局变量和导入可用。 字符串求值...

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

关于python3/hy - 使用 hy.eval 时,导入和全局变量不共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46366446/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com