2010年2月28日 星期日

注意 Python exec 的 scope

在 iPython 裡無法用 exec? 查到 exec 的文件, 卻能查到 eval、execfile。我才發現原來 Python 2 的 exec 是 statement! 如同 print, 到 Python 3 才改為 function。

若要讓 exec 執行後的結果能被其它 scope 的程式存取, 要改用「exec CODE in globals()」或「exec CODE in locals(), globals()」, 見下面的例子:

def add_hello():
    exec "def hello(): print 'hello'"
    hello()

add_hello()  # "hello"
hello()  # NameError: name 'hello' is not defined

def add_hello():
    exec "def hello(): print 'hello'" in locals(), globals()
    hello()

add_hello()  # "hello"
hello()  # "hello"

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...