[英]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))
我必須在傳遞給我的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.