python3/hy - при использовании hy.eval импорт и глобальные переменные не разделяются
Я понимаю как пользоваться hy.read_str
а также hy.eval
от питона, чтобы оценить 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))
вызов через строку, я должен повторять (import datetime)
позвонить через (do ...)
блок.
Есть ли способ при вызове hy
строки из Python, которые импортируют и глобальные, могут быть запомнены между последовательными вызовами hy.read_str/hy.eval
или что глобальные значения и импорт python могут быть распознаны при вызове строк через hy
?
1 ответ
Я понял это: если второй аргумент 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