** kwargs против 10 аргументов в функции Python? - PullRequest
5 голосов
/ 03 июня 2011

Я начинаю с python и пытаюсь создать XML-запрос для веб-службы ebay :

Теперь мой вопрос:

Скажите, этомоя функция:

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. Передать все аргументы: func (a = val1, b = val2, c = val3, d = val4 и т. д.)
  3. Используйте ** kwargs и доверьте человеку, который вызывает функцию, что он передает правильные ключи со значениями, потому что я буду использовать ключи для фактического построения XMLтеги.

Обновление:

Все xml-теги, которые вы видите в запросе, должны быть переданы пользователем.Но ключевые слова должны быть переданы , а другие могут быть переданы при необходимости.

Есть предложения?

Ответы [ 3 ]

7 голосов
/ 03 июня 2011

Хорошая идея - поместить все параметры с соответствующими значениями по умолчанию (или просто None значениями по умолчанию) в сигнатуру функции. Да, для этого потребуется немного больше ввода самой функции, но интерфейс будет чистым, самодокументированным и простым в использовании, так как вам не придется искать возможные параметры в документах ebay или источнике функций. Это сэкономит вам время позже.

0 голосов
/ 03 июня 2011

Я бы использовал именованные параметры для всех.Делая это, очень легко назначить значения по умолчанию и заставить пользователя указывать необходимые параметры (опуская значения по умолчанию)

0 голосов
/ 03 июня 2011

как насчет моделирования сообщения как класса?

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()
...