将 argparse 与采用 **kwargs 参数的函数一起使用

2023-11-20

我在用着argparse接受输入并将其传递给一个函数,该函数将两个变量作为参数**kwargs.

这是我的功能:

import requests
import sys
import argparse


def location_by_coordinate(LAT, LNG, **kwargs):
    if not kwargs:
        coordinate_url = "https://api.instagram.com/v1/locations/search?lat=%s&lng=%s&access_token=%s" % (LAT, LNG, current_token)
        r = requests.get(coordinate_url).text
    else:
        coordinate_url = "https://api.instagram.com/v1/locations/search?lat=%s&lng=%s&access_token=%s" % (LAT, LNG, current_token)
        for key, value in kwargs.iteritems():
            if 'DISTANCE' in kwargs:
                distance = kwargs.get('DISTANCE')
                if distance > 5000:
                    print distance
                    print "max distance is 5000m, value is reassigned to default of 1000m"
                    distance = 1000
                    coordinate_url = "https://api.instagram.com/v1/locations/search?lat=%s&lng=%s&access_token=%s" % (LAT, LNG, current_token)
                    r = requests.get(coordinate_url).text
                else:
                    pass
                    coordinate_url = "https://api.instagram.com/v1/locations/search?lat=%s&lng=%s&access_token=%s" % (LAT, LNG, current_token)
                    r = requests.get(coordinate_url).text
            if 'FACEBOOK_PLACES_ID' in kwargs:
                fb_places_id = kwargs.get('FACEBOOK_PLACES_ID')
                payload = {'FACEBOOK_PLACES_ID': '%s' % (fb_places_id), 'DISTANCE': '%s' % (DISTANCE)}
                r = requests.get(coordinate_url, params=payload).text
            if 'FOURSQUARE_ID' in kwargs:
                foursquare_id = kwargs.get('FOURSQUARE_ID')
                payload = {'FOURSQUARE_ID': '%s' % (foursquare_id), 'DISTANCE': '%s' % (DISTANCE)}
                r = requests.get(coordinate_url, params=payload).text
            if 'FOURSQUARE_V2_ID' in kwargs:
                foursquare_v2_id = kwargs.get('FOURSQUARE_V2_ID')
                payload = {'FOURSQUARE_V2_ID': '%s' % (foursquare_v2_id), 'DISTANCE': '%s' % (DISTANCE)}
                r = requests.get(coordinate_url, params=payload).text
    #print r
    return r

考虑到这个函数及其对 **kwargs 的使用,我应该如何设置子解析器?

到目前为止,我设置命令行解析器的方式如下:

 def main():
        parser = argparse.ArgumentParser(description="API Endpoints tester")
        subparsers = parser.add_subparsers(dest="command", help="Available commands")

        location_by_parser = subparsers.add_parser("location_by_coordinate", help="location function")
        location_by_parser.add_argument("LAT", help="latitude")
        location_by_parser.add_argument("LNG", help="longitude")

        arguments = parser.parse_args(sys.argv[1:])
        arguments = vars(arguments)
        command = arguments.pop("command")
        if command == "location_by_coordinate":
            LAT, LNG = location_by_coordinate(**arguments)
        else:
            print "No command provided..."

    if __name__ == "__main__":
        main()

显然,当我在命令行中调用上面的 main() 函数时,上面的 main() 函数与 location_by_coordinate() 函数一起工作得很好,如下所示:

$ python argstest.py location_by_coordinate 40.5949799 -73.9495148

但是按照目前的代码,如果我尝试:

$ python argstest.py location_by_coordinate 40.5949799 -73.9495148 DISTANCE=3000

显然,我得到:

argstest.py: error: unrecognized arguments: DISTANCE=3000

但我不确定如何为 **kwargs 设置子解析器。如果我尝试设置像这样的子解析器:

location_by_parser.add_argument("**kwargs", help="**kwargs")

然后再次尝试该命令:

$ python argstest.py location_by_coordinate 40.5949799 -73.9495148 DISTANCE=3000

这是行不通的,因为arguments对象(这是一个字典),变成这样:

{'LAT': '40.5949799', 'LNG': '-73.9495148', 'command': 'location_by_coordinate', '**kwargs': 'DISTANCE=3000'}

返回此回溯:

Traceback (most recent call last):
  File "argstest.py", line 118, in <module>
    main()
  File "argstest.py", line 108, in main
    foo = location_by_coordinate(**arguments)
  File "argstest.py", line 40, in location_by_coordinate
    return r
UnboundLocalError: local variable 'r' referenced before assignment

如何启用 argparse 来处理/解析在命令行中输入的内容(旨在通过 **kwargs 传递给函数)?


你明白这是怎么回事吗?

{'LAT': '40.5949799', 'LNG': '-73.9495148', 'command': 'location_by_coordinate', '**kwargs': 'DISTANCE=3000'}

arguments字典?您定义了一个名为“**kwargs”的“位置”参数(“dest”)。您也可以将其命名为“foobar”。解析器将字符串“DISTANCE=3000”分配给该属性args命名空间,它变成了字典键:值对arguments.

当然,您可以寻找arguments['**kwargs'],并自己解析该值:

v = arguments['**kwargs']  # or pop if you prefer
if v is not None:
    k, v = v.split('=')
    arguments[k] = int(v)

它可以泛化为处理多个对(用 `nargs='*' 定义)。


argparse处理参数的方式与 Python 函数不同,因此没有什么完全类似的**kwargs.

接受类似事情的正常方式distance带有“可选”或标记的参数。

parser.add_argument('-d','--distance', type=int, help=...)

它将接受

python argstest.py location_by_coordinate 40.5949799 -73.9495148 --distance=3000
python argstest.py location_by_coordinate 40.5949799 -73.9495148 --distance 3000
python argstest.py location_by_coordinate 40.5949799 -73.9495148 --d3000
python argstest.py location_by_coordinate 40.5949799 -73.9495148

也可以设置为使用--DISTANCE或其他名称。在最后一种情况下args命名空间将有一个默认值distance。默认的默认值是None.

这是直接添加的方法kwarg就像论据argparse.

接受任意字典,如对,distance:3000, distance=3000,之前曾被问过。答案总是我上面概述的解析的一些变体。它可以在自定义 Action 类中完成,或者按照我的建议进行后解析。

哎呀,这个答案几乎是我几天前写的答案的克隆:https://stackoverflow.com/a/33639147/901925

2011年类似的问题:使用 argparse 解析“arg= val”形式的参数

Python argparse 字典 arg

===================================

(edit)

带有一个函数的示例*args:

In [2]: import argparse
In [3]: def foo(*args, **kwargs):
   ...:     print('args',args)
   ...:     print('kwargs',kwargs)
   ...:     
In [4]: parser=argparse.ArgumentParser()
In [5]: parser.add_argument('arg1')
In [6]: parser.add_argument('arg2',nargs='+')

In [7]: args=parser.parse_args('one two three'.split())
In [8]: args
Out[8]: Namespace(arg1='one', arg2=['two', 'three'])

所以我有 2 个位置参数,一个具有单个字符串值,另一个具有列表(由于+ nargs).

Call foo用这些args属性:

In [10]: foo(args.arg1)
args ('one',)
kwargs {}

In [11]: foo(args.arg1, args.arg2)
args ('one', ['two', 'three'])
kwargs {}

In [12]: foo(args.arg1, arg2=args.arg2)
args ('one',)
kwargs {'arg2': ['two', 'three']}

我定义了“位置”,但它与“可选”同样有效。位置和可选之间的区别在命名空间中消失了。

如果我将命名空间转换为字典,我可以将值传递给foo以各种方式,或者通过*args或通过**kwargs。这一切都取决于我如何称呼foo,而不是它们的出现方式args or arguments。这些都不是独一无二的argparse.

In [13]: arguments = vars(args)
In [14]: arguments
Out[14]: {'arg2': ['two', 'three'], 'arg1': 'one'}

In [15]: foo(arguments['arg2'], arguments['arg1'])
args (['two', 'three'], 'one')
kwargs {}

In [16]: foo(arguments['arg2'], arguments)
args (['two', 'three'], {'arg2': ['two', 'three'], 'arg1': 'one'})
kwargs {}

In [17]: foo(arguments['arg2'], **arguments)
args (['two', 'three'],)
kwargs {'arg2': ['two', 'three'], 'arg1': 'one'}

In [24]: foo(*arguments, **arguments)
args ('arg2', 'arg1')             # *args is the keys of arguments
kwargs {'arg2': ['two', 'three'], 'arg1': 'one'}

In [25]: foo(*arguments.values(), **arguments)
args (['two', 'three'], 'one')    # *args is the values of arguments
kwargs {'arg2': ['two', 'three'], 'arg1': 'one'}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 argparse 与采用 **kwargs 参数的函数一起使用 的相关文章

  • 在 Pandas 数据框中显示对图

    我试图通过从 pandas 数据框中的 scatter matrix 创建来显示一对图 这就是创建配对图的方式 Create dataframe from data in X train Label the columns using th
  • Pandas 用单位插值数据

    大家好 几年来我一直在寻找 Stackoverflow 它对我帮助很大 以至于我以前不需要注册 但今天我遇到了一个使用 Python 与 Pandas 和 Quantities 也可能是 unum 或 pint 的问题 我尽力发表清晰的帖子
  • 如何在Python和C++之间交换数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想用 Python 编写一个程序 读取 2 个数字 从文本文件或用户输入 调用一个接受 2 个参数 这 2 个数字 的 C 函数 将
  • 如果文件不存在,使用 python 添加一行

    我有一个 xml 文件如下
  • 使用正则表达式的 Strip() 函数

    我正在尝试重新创建strip 使用正则表达式的Python函数 这是最后一个练习题用 Python 自动化处理无聊的事情 https automatetheboringstuff com chapter7 这是我的代码 import re
  • 在Python中从字符串中删除除字母数字字符之外的所有内容

    使用 Python 从字符串中去除所有非字母数字字符的最佳方法是什么 中提出的解决方案这个问题的 PHP 变体 https stackoverflow com questions 840948可能会进行一些小的调整 但对我来说似乎不太 Py
  • 获取 Pandas Dataframe 中列名的排名

    我将客户 ID 与他们最常购买的表演类型进行比较 Genre Jazz Dance Music Theatre Customer 100000000001 0 3 1 2 100000000002 0 1 6 2 100000000003
  • 从 colab 中的驱动器中的 python 脚本导入 python 模块

    我目前正在 Google Colab 上开展一个使用 Tensorflow API 的机器学习项目 我创建了一个文件夹并将其上传到谷歌驱动器上以在谷歌Colab上运行 我成功安装了谷歌驱动器并可以运行脚本 但是当我尝试从同一文件夹中的脚本导
  • 在Python中使用readlines?第一次

    我有一个包含数据列的文本文件 我需要将这些列转换为单独的列表或数组 这就是我到目前为止所拥有的 f open data txt r temp for row in f readlines Data row split temp append
  • 使用 imaplib 库连接到电子邮件时遇到 AUTHENTICATIONFAILED 错误

    如何连接到 imaplib 库而不遇到 AUTHENTICATIONFAILE 错误 通过网络浏览器登录时 我的 Gmail 收件箱显示严重的安全警报 登录尝试被阻止 IMAP SERVER imap gmail com USERNAME
  • manage.pysyncdb 不会为某些模型添加表

    今天我的第二个不太熟练的问题 我有一个 django 项目 其中安装了四个应用程序 当我运行manage py syndb时 它只为其中两个创建表 据我所知 我的任何模型文件都没有问题 并且所有应用程序都在我的设置文件中的 INSTALLE
  • 为什么在我的例子中 For 循环比 Map、Reduce 和 List 理解更快

    我编写了一个简单的脚本来测试速度 这就是我发现的结果 实际上 for 循环在我的例子中是最快的 这真的让我感到惊讶 请查看下面 正在计算平方和 这是因为它在内存中保存列表还是有意为之 谁能解释一下这一点 from functools imp
  • 根据另一个参数的值添加参数

    根据输入之一 我想初始化某些对象 这些对象的值将是其余参数的默认值 因此 即使在 parser parse args 之前 我也需要参数之一的值 我如何使用 python argparse 模块来实现这一点 所有选项都将作为一个命令行给出
  • Python 类中的继承顺序

    我有课ExampleSim它继承自基类Physics class Physics object arg1 arg1 def physics method print physics method class ExampleSim Physi
  • python中的“如果不是”条件语句[重复]

    这个问题在这里已经有答案了 if not start new next None return new 如果不是 是什么意思 这段代码什么时候执行 这和说的是一样的吗 if start None 那么做点什么 if是声明 not start
  • bdist_rpm 从 Ubuntu 到 CentOs

    我们在 Ubuntu Mac 上进行开发 并将 RPM 部署到 CentOS 这是设置 不能更改太多 问题是 当从 rpm 安装时 软件包会转到 usr local lib python2 7 dist packages 这是 Ubuntu
  • 使用 numpy 数组计算累积最小值

    我想计算 累积最小值 数组 基本上 数组到每个索引的最小值 例如 import numpy as np nums np array 5 3 4 2 1 1 2 0 cumulative min np zeros nums size dtyp
  • 删除 numpy 中的循环以进行简单的矩阵分配

    如何删除这个简单矩阵分配中的循环以提高性能 nk ncol nrow index shape for kk in range 0 nk for ii in range 0 nrow for jj in range 0 ncol idx in
  • 如何获取当前的 IPython / Jupyter Notebook 名称

    我试图在运行 IPython 笔记本时获取当前的笔记本名称 我知道我可以在笔记本顶部看到它 我在追求什么 currentNotebook IPython foo bar notebookname 我需要在变量中获取名称 添加到以前的答案 要
  • 缩放插图中不同的 x 和 y 比例,matplotlib

    我正在尝试使用 matplotlib 制作插图 目前我有类似最后一个答案的内容如何缩放图像的一部分并插入到 matplotlib 中的同一图中 https stackoverflow com questions 13583153 how t

随机推荐