簡體   English   中英

python3 / hy-使用hy.eval時,不共享導入和全局變量

[英]python3/hy - When using hy.eval, imports and globals are not shared

我了解如何使用python中的hy.read_strhy.eval來評估python中的hy表達式。 但是,當我使用這種方法時, hypython環境之間不會共享導入和全局變量。 考慮以下示例:

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))

我必須在傳遞給我的hyeval函數的字符串中顯式導入datetime ...

... 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.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.752656

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM