我了解如何从python中使用hy.read_str和hy.eval来计算python中的hy表达式。但是,当我使用这种方法时,导入和全局在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))调用,则必须继续通过(do ...)块重复(import datetime)调用。
在从python内部调用hy字符串时,是否有任何方式可以在连续调用hy.read_str/hy.eval期间记住导入和全局,或者在通过hy调用字符串时可以识别python和hy
发布于 2017-09-22 14:29:56
我知道了:如果hy.eval的第二个参数是globals(),那么在执行hy字符串计算时,python环境的globals和imports是可用的.
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.752656https://stackoverflow.com/questions/46366446
复制相似问题