2011-06-03 8 views
5

estoy empezando a cabo con pitón y tratando de construir una solicitud XML para un ebay web service:** kwargs vs 10 argumentos en una función python?

Ahora, mi pregunta es:

decir que este es mi función:

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) 

Cuando, palabra clave es el único campo requerido. Entonces, ¿cómo debería construir el método? Las formas pueden ser:

  1. crear un objeto, pase a la func (objeto): La forma java
  2. Pass todos los argumentos: func (a = val1, b = val2, c = val3, d = val4 etc.)
  3. Use ** kwargs y confíe en la persona que llama a la función, que pasa las claves correctas con los valores, porque usaré las claves para construir realmente las etiquetas XML.

Actualización:

Todas las etiquetas XML que se ven en la solicitud son necesarios para ser aprobada por el usuario. Pero las palabras clave deben pasarse y otras pueden aprobarse si es necesario.

¿Alguna sugerencia?

+0

¿Qué campos deben poder cambiar otras funciones? –

+0

no entendió eso. todos estos campos son solo locales para esta función. – zengr

+0

En otras palabras, ¿qué campos necesita especificar el programa sobre la marcha? –

Respuesta

7

Una buena idea es poner todos los parámetros con valores predeterminados apropiados (o sólo None por defecto) en la firma de la función. Sí, requerirá un poco más de tipeo en la función en sí, pero la interfaz será limpia, auto-documentada y fácil de usar, ya que no tendrá que buscar posibles parámetros en documentos de eBay o fuente de función. Le ahorrará tiempo más adelante.

+0

Sí, también estoy a favor de este enfoque, es decir, enfoque 2. – zengr

+1

De acuerdo. '** kwargs' es principalmente útil cuando no sabes de antemano qué nombres de argumento estás esperando (ver, por ejemplo,' str.format').Si está esperando argumentos particulares, es mejor especificarlos explícitamente. – lvc

0

¿qué tal si modelamos el mensaje como clase?

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

¿Por qué el voto a favor? – Johnsyweb

+0

Me gustaría saber también, esto se ve bien para mí. Pero no estoy al tanto de las formas pitónicas. – zengr

+0

Presumiblemente, ¿quiso decir 'req = FindBestMatchItemDetailsAcrossStoresRequest ('ipod')'? – Johnsyweb

0

Yo usaría los parámetros nombrados para todos. Al hacerlo, es muy fácil asignar valores predeterminados y obligar al usuario a suministrar los parámetros necesarios (omitiendo el valor predeterminado)

Cuestiones relacionadas