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
Другие вопросы по тегам