为了账号安全,请及时绑定邮箱和手机立即绑定

变量参数 vs Python 中的列表作为函数参数

变量参数 vs Python 中的列表作为函数参数

智慧大石 2021-12-21 16:00:49
我想了解什么时候应该在 Python 2.7 的函数参数中使用可变参数 vs 列表类型假设我编写了一个处理 URL 列表的函数。我可以用两种不同的方式定义函数:选项1:def process_urls(urls):  if not isinstance(urls, list) or  isinstance(urls, tuple):       raise TypeError("urls should be a list or tuple type")选项 2: def process_urls(*urls):      # urls is guaranteed to be a tuple选项 2 保证urls是一个元组,但可以接受随机数量的位置参数,这些参数可能是垃圾,例如process_urls(['url1', 'url2'], "this is not a url")从编程的角度来看,哪个选项是首选?
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

第一个,但没有类型检查。类型检查杀死鸭子打字。如果调用者想要传入生成器、集合或其他可迭代对象怎么办?不要将它们限制为列表和元组。


查看完整回答
反对 回复 2021-12-21
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

两者都不是最好的。每种风格在不同情况下都有好处。


大多数时候使用单个可迭代参数会更好,特别是如果调用者已经将 URL 打包到列表中。如果他们有一个列表并且需要使用 varargs 样式,则他们需要调用process_urls(*existing_list_of_URLs)whoild 不必要地解包然后重新打包参数。正如John Kugelman在他的回答中所建议的那样,您可能不应该使用显式类型检查来强制参数的类型,只需假设它是一个可迭代的并从那里开始工作。


如果您的函数主要使用单独的 URL 调用,则使用可变参数列表可能比需要列表更好。比如,也许网址是硬编码是这样的:process_urls("http://example.com", "https://stackoverflow.com")。或者它们可能在单独的变量中,但要使用的特定变量直接编码为:process_url(primary_url, backup_url)。


最后一个选择:支持这两种方法!您可以指定您的函数接受一个或多个参数。如果它只得到一个,它需要一个包含 URL 的可迭代对象。如果它得到多个参数,它希望每个参数都是一个单独的 URL。这可能是这样的:


def process_urls(*args):

    if len(args) == 1:

        args = args[0]


    # do stuff with args, which is an iterable of URLs

这样做有一个缺点,即自身传递的单个 URL 字符串将被错误地识别为一系列 URL,每个 URL 由原始字符串中的一个字符组成。这是一个非常尴尬的失败案例,因此您可能需要明确检查它。您可以选择引发异常,或者只接受单个字符串作为参数,就像它在容器中一样。


查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信