【问题标题】:**kwargs vs 10 arguments in a python function?**kwargs 与 python 函数中的 10 个参数?
【发布时间】:2011-06-03 06:05:32
【问题描述】:

我开始使用 python 并尝试为 ebay web service 构建 XML 请求:

现在,我的问题是:

说,这是我的功能:

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(object):java方式
  2. 传递所有参数:func(a=val1, b=val2, c=val3, d=val4 etc)
  3. 使用 **kwargs 并相信调用函数的人,他将正确的键与值一起传递,因为我将使用键来实际构造 XML 标记。

更新:

您在请求中看到的所有xml标签都需要由用户传递。但是关键字应该被传递,如果需要,其他的可能被传递。

有什么建议吗?

【问题讨论】:

  • 其他功能需要哪些字段才能改变?
  • 不明白。所有这些字段都只是这个函数的本地字段。
  • 换句话说,程序需要动态指定哪些字段?
  • 嗯,字符串请求中的所有恶魔都应该由方法的用户传递。唯一的区别是,除了&lt;keywords&gt;ipod&lt;/keywords&gt;,所有字段都是可选的,这是强制性的。
  • 我认为这是一个“显式更好”的案例

标签: python xml ebay-api


【解决方案1】:

一个好主意是将所有具有适当默认值(或仅None 默认值)的参数放入函数签名中。是的,它需要在函数本身中输入更多内容,但界面将是干净的、自记录的且易于使用,因为您不必在 ebay 文档或函数源中查找可能的参数。以后会为您节省时间。

【讨论】:

  • 是的,我也赞成这种方法,即方法2。
  • 同意。 **kwargs 主要在您事先不知道您期望的参数名称时有用(例如,参见str.format)。如果您期待特定的参数,最好明确指定它们。
【解决方案2】:

如何将消息建模为一个类?

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

【讨论】:

  • 我也想知道,这对我来说看起来不错。但我不知道蟒蛇的方式。
  • 大概,你的意思是req = FindBestMatchItemDetailsAcrossStoresRequest('ipod')
  • 更新了我的问题。我想你误解了我的问题。在这种情况下,如果用户想通过:siteResultsPerPage 怎么办?我将如何实现这一目标?
  • @Johnsyweb 它会抛出 TypeError,因为 Gareth 忘记了 self。另外,我没有看到使用类而不是 defaultdict 的意义。
【解决方案3】:

我会为所有参数使用命名参数。通过这样做,很容易分配默认值,并强制用户提供所需的参数(通过省略默认值)

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2022-12-01
    • 2020-09-18
    • 2012-04-09
    • 2015-05-30
    • 2015-10-08
    • 2012-12-29
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多