2011-06-03 18 views
5

我開始接觸蟒蛇,並試圖構建一個ebay web service的XML請求:** kwargs vs python函數中的10個參數?

現在,我的問題是:

說,這是我的函數:

def findBestMatchItemDetailsAcrossStores(): 
    request = """<?xml version="1.0" encoding="utf-8"?> 
    <findBestMatchItemDetailsAcrossStoresRequest xmlns="http://www.ebay.com/marketplace/search/v1/services"> 
    <siteResultsPerPage>50</siteResultsPerPage> 
    <entriesPerPage>50</entriesPerPage> 
    <ignoreFeatured>true</ignoreFeatured> 
    <keywords>ipod</keywords> <-----REQUIRED 
    <itemFilter> 
    <paramName>PriceMin</paramName> 
    <paramValue>50</paramValue> 
    <name>Currency</name> 
    <value>USD</value> 
    </itemFilter> 
    <itemFilter> 
    <paramName>PriceMax</paramName> 
    <paramValue>100</paramValue> 
    </itemFilter> 
    </findBestMatchItemDetailsAcrossStoresRequest>""" 
    return get_response(findBestMatchItemDetailsAcrossStores.__name__, request) 

其中,關鍵字是唯一必需的字段。那麼,我應該如何構建這個方法呢?方式可以是:

  1. 創建一個對象,把它傳遞給FUNC(對象):Java的方式
  2. 通行證所有參數:函數(A = VAL1,B = val2的,C = VAL3,d = val4等)
  3. 使用** kwargs並相信調用函數的人,他將正確的鍵傳遞給值,因爲我將使用這些鍵實際構造XML標記。

更新:

所有你在申請中看到的XML標記都需要由用戶通過。但關鍵字應該被傳遞,如果需要可以傳遞其他人。

有什麼建議嗎?

+0

其他功能需要更改哪些字段? – 2011-06-03 06:15:00

+0

沒有得到。所有這些字段僅適用於此功能。 – zengr 2011-06-03 06:16:41

+0

換句話說,該程序需要在運行中指定哪些字段? – 2011-06-03 06:19:20

回答

7

一個好主意是把所有與函數簽名適當的默認值(或只是None默認值)的參數。是的,它需要在函數本身中輸入更多的內容,但界面將是乾淨的,自我記錄的並且易於使用,因爲您不必在ebay文檔或函數源中查找可能的參數。這會節省你以後的時間。

+0

是的,我也贊同這種方法,即方法2. – zengr 2011-06-03 06:27:16

+1

同意。 ''kwargs'主要用於你事先不知道你期望的參數名稱(參見例如'str.format')。如果您期待特定參數,最好明確指定它們。 – lvc 2011-06-03 07:59:26

0

如何將消息建模爲一個類?

class FindBestMatchItemDetailsAcrossStoresRequest: 
    def __init__(self,keywords): 
     self.keywords = keywords # required parameters in the constructor 
     # set up the default values....etc 
     self.siteResultsPerPage = 50 
     self.name = 'Currency' 


    def send(self): 
     # build message from self.xxx 
     return get_response() 


#usage 
req = FindBestMatchItemDetailsAcrossStoresRequest('ipod') 
response = req.send() 

#usage with optional args 

req.siteResultsPerPage = 150 
response = req.send() 
+0

爲什麼downvote? – Johnsyweb 2011-06-03 06:14:53

+0

我也想知道,這看起來對我很好。但我不知道pythonic的方式。 – zengr 2011-06-03 06:15:12

+0

大概你的意思是'req = FindBestMatchItemDetailsAcrossStoresRequest('ipod')'? – Johnsyweb 2011-06-03 06:16:04

0

我會使用所有的命名參數。通過這樣做,分配默認值以及強制用戶提供所需參數非常容易(通過省略默認值)