2010-08-14 102 views
2

我寫了一個很好的小應用程序,它可以獲取Yahoo天氣信息並將其發佈到Twitter。它的工作完美無瑕,現在我想將代碼重新排列成不同名稱的文件,因此更有意義。那是我遇到一些問題的時候。將實例作爲函數參數

此前,我有一個Classlibtweather.py。這是我的account。它允許我做​​,我會得到解析的雅虎天氣的輸出。 __ini__接過天氣網址,Twitter的用戶名和密碼參數)

這是從我的主腳本訪問其創建的Class像這樣的實例:
exec '%s = lw.twitterWeather("%s", "%s", "%s")' % (item[0], item[1], item[2], item[3]) 它保存在一個帳號名字列表列表作爲參數傳遞給其他函數。

另一個功能getWeather做了天氣:

def getWeather(accountList): #account names passed as a list of strings 
    for item in accountList: 
     print item, ': ', 
     item = eval(item)  
     print item.parseFeed(), '\n 

我現在已經決定將getWeather功能移動到同一個文件作爲Class但行item = eval(item)的給我的問題,因爲沒有實例在該文件中創建。所有這些都在主要腳本中。

現在我的問題:有什麼辦法可以將這些實例作爲函數的參數?或者我必須把該功能放入Class?即使我這樣做,我仍然需要爲列表中的多個項目執行item.parseFeed(),所以我仍然需要item = eval(item),不是嗎?

在此先感謝。我的應用稍微有點整體發佈,但如果需要更好地瞭解,我會發布更多代碼。

更新:我結束了我的運行時libtweather.py它導入到創建實例,這樣裏面的函數可以訪問它們(添加實例在腳本的底部生成代碼)。我確信有更好的方法,但目前對我來說很有效,我對此很滿意。

+1

爲什麼選擇使用'exec'來創建類的實例有什麼具體的原因嗎? – 2010-08-14 19:12:21

+0

沒有任何。除此之外,這是我在Google上遇到的第一種方式。我知道我可以使用'globals()','vars()'或'locals()'。我正在看他們,看看我將要使用哪一個。 – avacariu 2010-08-14 19:18:59

+0

如果您發現自己需要使用'eval'或'exec',則不要。改爲做其他事情。千萬不要使用它們。除非你需要,當然,這就是爲什麼他們在那裏,但在你不知道你需要他們之前,你必須知道有沒有其他的好方法去做你想做的事。這幾乎從未如此。 – aaronasterling 2010-08-14 20:53:46

回答

5

您應該使用明確的字典來存儲這些項目。 evalexec,globals,localsvars都是很糟糕的做法,很糟糕。請記住Python的禪宗:「顯式比隱式更好。」

feeds = {} 
for item in whatever: 
    feeds[item[0]] = lw.twitterWeather(*item[1:]) 

def getWeather(feeds, accountList): 
    for item in accountList: 
     print '%s: %s' % (item, feeds[item].parseFeed()) 
+0

禪宗的+1參考 – Odomontois 2010-08-14 21:28:20

+0

我從來沒有想過一個字典。這個應用程序是我開始學習Python的方式,而我最近纔開始意識到dicts的驚人之處。 但是,如果我在類中定義了'getWeather',並且在主腳本中生成了實例(與Class文件分開),那麼可以將此dict作爲參數傳遞給我的函數,並將實例指向正確的位置(在Class文件中,函數不能有'lw.whatever',因爲'lw'永遠不會被導入。)並且感謝'* item [1:]';不知道你能做到這一點。 *對不起,但我仍然對所有這些新的:P * – avacariu 2010-08-14 21:31:51

+0

所以我最終改變了這一點。它沒有像我之前所做的那樣花很多時間來讓我的函數使用字典。 儘管我沒有使用與我最初的問題相同的組織(我在libtweather.py中創建實例,而不是在主腳本中),但我嘗試將該字典傳遞給'libtweather中的'getWeather'函數。 py'從我的主腳本中運行。實例被接受沒有錯誤。所以回答接受。謝謝! – avacariu 2010-08-15 00:22:25