【发布时间】:2023-10-22 04:36:01
【问题描述】:
我正在使用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()
显然,当我像这样在命令行中调用 location_by_coordinate() 函数时,上面的 main() 函数可以正常工作:
$ 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:
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 传递给函数?
【问题讨论】:
-
您可能还会查看一个构建在
argparse之上的名为plac的包。它尝试根据一个或多个函数的参数定义填充解析器。 pypi.python.org/pypi/plac
标签: python python-2.7 command-line argparse keyword-argument