【问题标题】:Passing key-value pairs as function parameters in Python在 Python 中将键值对作为函数参数传递
【发布时间】:2015-11-15 18:10:44
【问题描述】:

我正在使用 Python Flickr API,但在定义函数时遇到问题(我对 Python 有点陌生)。

我需要将以下 api 功能包装到一个函数中:

photos = flickr.photos_search(
    tags="foo",
    is_commons="True")

这会从 Flickr 的 Commons 收藏中返回标签“foo”的照片搜索。

现在我想在每次搜索时替换标签,所以我将它包装在一个函数中:

def search_photos(fl_tags):
    photos = flickr.photos_search(
        tags=fl_tags,
        is_commons="True")

search_photos("foo")

这可行,is_commons 标志但是,我需要偶尔完全替换(不仅是值,还有键,因为 Flickr 的 API 中似乎有一个错误,它总是在 Commons 集合中搜索,无论是哪个值你设置的标志)。

在这种情况下,我想将其替换为键值组合license="9"

我不知道如何将它放入函数参数中。如果我提供一个fl_license 参数并在调用该函数时将其简单地设置为license="9",那么这不起作用(正如我所预料的那样)。

def search_photos(fl_tags, fl_license):
    photos = flickr.photos_search(
        tags=fl_tags,
        fl_license)

search_photos("foo", license="9")    # --> SyntaxError: non-keyword arg after keyword arg

有没有办法让它工作。如何通过函数参数获取键值对?

谢谢!

【问题讨论】:

  • 所以基本上将license="9" 传递给flickr.photos_search 函数?你能在那里传递dict吗?
  • @Zizouz212 是的,完全正确。将字典传递给 flickr.photos.search 不起作用,而是返回类型错误。 photos = flickr.photos_search(fl_dict) TypeError: __call__() 只需要 1 个参数(给定 2 个)

标签: python python-2.7 arguments flickr


【解决方案1】:

你可以试试这样的:

def search_photos(fl_tags, license_val=''):
    if not license_val:
        photos = flickr.photos_search(
            tags=fl_tags,
            is_commons="True")
    else:
        photos = flickr.photos_search(
            tags=fl_tags,
            license=license_val)
    return photos

search_photos("foo") # gives you the same output as before
search_photos("foo", "9") # gives you the search with license as 9

variable = '' 如果没有给出参数,则默认将该参数设置为空字符串(空字符串评估为 false,因此如果您不传入第二个参数,该函数将默认为公共搜索)。否则,它将把第二个参数作为license_val= 参数。

【讨论】:

    【解决方案2】:

    我相信您正在寻找“关键字参数”。这篇 StackOverflow 帖子 (Python normal arguments vs. keyword arguments) 确实帮助我理解了这个概念,因为我也是新手。

    基本上,函数从调用中接收到的任何参数都将被分配到一个dict中,函数参数的名称用“**”指定。

    【讨论】:

    • 谢谢,虽然问题已经回答了,我会研究一下,因为我不熟悉这几种类型的论点。
    猜你喜欢
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2014-06-07
    • 2016-02-21
    相关资源
    最近更新 更多