2015-08-16 47 views
2

對於pandasql包的sqldf方法,有一個「會話/環境變量」,可能是locals()或globals(),任何人都可以讓我知道它是什麼?任何文檔引用何時應該使用locals(),以及何時應該使用globals()?關於pandasql locals()和globals()方法問題

https://github.com/yhat/pandasql/

這裏是我的代碼,不知道是什麼東西pandansql正在尋找徹底的當地人()?而locals()是指方法select_first_50內的命名空間?

def select_first_50(filename): 
    students = pandas.read_csv(filename) 
    students.rename(columns = lambda x: x.replace(' ', '_').lower(), inplace=True) 

    q = "select major, gender from studentstable limit 50" 

    #Execute your SQL command against the pandas frame 
    results = pandasql.sqldf(q.lower(), locals()) 
    return results 

回答

2

locals()globals()是用來返回相應的命名空間的Python內置函數。

在Python中,命名空間是一種實現範圍的方法。所以全局名稱空間意味着全局作用域,因此定義的變量(名稱)在整個模塊中都可見。

本地namepsace是特定函數本地的名稱空間。

globals()返回表示當前全局名稱空間的字典。

locals()的返回值取決於它被調用的位置,當直接在腳本範圍內調用時(不在特定函數內)時,它將返回與全局名稱空間globals()相同的字典。在函數內調用時,它會返回本地名稱空間。

在pandasql中,您需要傳遞的第二個參數基本上就是包含您在查詢中使用的變量的這個名稱空間(字典)。那就是讓我們假設你創建一個名爲a的DataFrame,然後在它上面寫下你的查詢。然後,pandasql需要知道名稱爲a的DataFrame,因爲它需要本地/全局名稱空間,這就是第二個參數的用途。例如,如果您的DataFrame僅在函數內部定義且不存在於全局範圍內,則需要傳回locals()返回字典,如果您的DataFrame存在於全局範圍內,你需要通過globals()的結果。

+0

很好的答案。我已經在我原來的帖子中發佈了我的代碼,並且想知道pandansql在我的情況下尋找徹底的本地化()的什麼東西?而locals()是指方法select_first_50內的命名空間? –

+1

在你的代碼中,它工作?應該不是sql裏面的表的名字是'students'?在'locals()'裏面尋找'students'表。 –

+0

所以locals()是指select_first_50的函數範圍?順便說一句,它適用於我。 –