python3/hy - 使用 hy.eval 时,不共享导入和全局变量
python3/hy - When using hy.eval, imports and globals are not shared
我了解如何使用 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
的连续调用之间记住导入和全局变量,或者 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
我了解如何使用 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
的连续调用之间记住导入和全局变量,或者 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