2017-09-22 27 views
1

我知道如何使用python中的hy.read_strhy.eval來評估python中的hy表達式。但是,當我使用此方法時,導入和全局變量不在hypython環境之間共享。考慮下面這個例子:python3/hy - 當使用hy.eval時,導入和全局變量不共享

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)通話。

從蟒蛇是進口和全局可連續調用之間記得hy.read_str/hy.eval中調用hy字符串時,或者說,蟒蛇全局和進口可以通過調用hy字符串時,承認有什麼辦法?

回答

1

我想通了:如果第二個參數是hy.evalglobals(),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