Python argparse 字典 arg
Python argparse dict arg
我想从命令行接收 dict(str -> str)
参数。 argparse.ArgumentParser
提供吗?或者任何其他图书馆?
对于命令行:
program.py --dict d --key key1 --value val1 --key key2 --value val2
我需要以下字典:
d = {"key1": "val1", "key2": "val2"}
Python 接收数组形式的参数 argv
。您可以使用它在程序本身中创建字典。
import sys
my_dict = {}
for arg in sys.argv[1:]:
key, val=arg.split(':')[0], arg.split(':')[1]
my_dict[key]=val
print my_dict
对于命令行:
python program.py key1:val1 key2:val2 key3:val3
输出:
my_dict = {'key3': 'val3', 'key2': 'val2', 'key1': 'val1'}
Note: args will be in string, so you will have to convert them to store numeric values.
希望对您有所帮助。
至于像 argparse, docopt and click 这样的当前库,其中 none 支持使用 dict
args。我能想到的最好的解决方案是自定义 argparse.Action
自己支持它:
import argparse
class MyAction(argparse.Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
super(MyAction, self).__init__(option_strings, dest, nargs, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
print '%r %r %r' % (namespace, values, option_string)
value_dict = {}
values.reverse()
while len(values) > 0:
v = eval(values.pop()).lstrip('--') # This is like crazy hack, I know.
k = eval(values.pop())
value_dict[k] = v
setattr(namespace, self.dest, value_dict)
parser = argparse.ArgumentParser()
parser.add_argument('-d', action=MyAction, nargs='*')
args = parser.parse_args('-d "--key" "key1" "--value" "val1" "--key" "key2" "--value" "val2"'.split())
print(args)
我会使用这样的东西:
p = argparse.ArgumentParser()
p.add_argument("--keyvalue", action='append',
type=lambda kv: kv.split("="), dest='keyvalues')
args = p.parse_args("--keyvalue foo=6 --keyvalue bar=baz".split())
d = dict(args.keyvalues)
您可以创建自定义操作,将 "append" 已解析的键值对直接放入字典,而不是简单地累积 (key, value)
元组列表。 (我看到的是 skyline75489 所做的;我的回答不同之处在于使用带有自定义类型的单个 --keyvalue
选项而不是单独的 --key
和 --value
选项来指定对。)
一种直接解析输入的方法,例如:
program.py --dict d --key key1 --value val1 --key key2 --value val2
是:
parser=argparse.ArgumentParser()
parser.add_argument('--dict')
parser.add_argument('--key', action='append')
parser.add_argument('--value', action='append')
args = parser.parse_args()
应该产生(如果我的心理分析器是正确的)
args = Namespace(dict='d', key=['key1','key2'], value=['value1','value2'])
你应该能够从中构造一个字典:
adict = {k:v for k, v in zip(args.key, args.value)}
使用 args.dict
将其分配给具有该名称的变量需要一些非 python 技巧。最好的办法是在另一个字典中用这个名字创建一个元素。
another_dict = {args.dict: adict}
此解决方案不会执行太多错误检查。例如,它不能确保键和值的数量相同。它还不会让您创建多个词典(即重复 --dict
参数)。它不需要任何特殊订单。 --dict
可能出现在 --key key1
对之后。几个 --value
参数可以放在一起。
将 key=value
与 chepner
捆绑在一起确实解决了一些问题。
这里是另一个使用自定义操作的解决方案,如果你想一起指定字典键对comma-separated --
import argparse
import sys
parser = argparse.ArgumentParser(description='parse key pairs into a dictionary')
class StoreDictKeyPair(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
my_dict = {}
for kv in values.split(","):
k,v = kv.split("=")
my_dict[k] = v
setattr(namespace, self.dest, my_dict)
parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, metavar="KEY1=VAL1,KEY2=VAL2...")
args = parser.parse_args(sys.argv[1:])
print args
运行:
python parse_kv.py --key_pairs 1=2,a=bbb,c=4 --key_pairs test=7,foo=bar
输出:
Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})
如果您想在字符串中使用 nargs 而不是 comma-separated 值:
class StoreDictKeyPair(argparse.Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
self._nargs = nargs
super(StoreDictKeyPair, self).__init__(option_strings, dest, nargs=nargs, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
my_dict = {}
print "values: {}".format(values)
for kv in values:
k,v = kv.split("=")
my_dict[k] = v
setattr(namespace, self.dest, my_dict)
parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, nargs="+", metavar="KEY=VAL")
args = parser.parse_args(sys.argv[1:])
print args
运行
python arg_test4.py --key_pairs 1=2 a=bbb c=4 test=7 foo=bar
输出:
values: ['1=2', 'a=bbb', 'c=4', 'test=7', 'foo=bar']
Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})
Python 一行 argparse 字典参数 argparse_dictionary.py
# $ python argparse_dictionary.py --arg_dict=1=11,2=22;3=33 --arg_dict=a=,b,c=cc,=dd,=ee=,
# Namespace(arg_dict={'1': '11', '2': '22', '3': '33', 'a': '', 'c': 'cc', '': 'dd'})
import argparse
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument(
'--arg_dict',
action=type(
'', (argparse.Action, ),
dict(__call__=lambda self, parser, namespace, values, option_string: getattr(
namespace, self.dest).update(
dict([
v.split('=') for v in values.replace(';', ',').split(',')
if len(v.split('=')) == 2
])))),
default={},
metavar='KEY1=VAL1,KEY2=VAL2;KEY3=VAL3...',
)
print(arg_parser.parse_args())
另一种简单的方法:
parser = argparse.ArgumentParser()
parser.add_argument('--key1')
parser.add_argument('--key2')
args = parser.parse_args()
my_dict = args.__dict__
如果您只是想将 argparse 输入转换为字典,Python 3.6 中有一个简单的解决方案。举例如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input', help='the path to the input file')
parser.add_argument('-o', '--output', help='the path to the output file')
args = parser.parse_args()
arguments = dict(args._get_kwargs())
for k, v in arguments.items():
print(k, v)
给定命令行输入,例如 python3 script_name.py --input 'input.txt' --output 'output.txt'
,代码将输出到终端:
input input.txt
output output.txt
使用变量
d = vars(parser.parse_args())
我想从命令行接收 dict(str -> str)
参数。 argparse.ArgumentParser
提供吗?或者任何其他图书馆?
对于命令行:
program.py --dict d --key key1 --value val1 --key key2 --value val2
我需要以下字典:
d = {"key1": "val1", "key2": "val2"}
Python 接收数组形式的参数 argv
。您可以使用它在程序本身中创建字典。
import sys
my_dict = {}
for arg in sys.argv[1:]:
key, val=arg.split(':')[0], arg.split(':')[1]
my_dict[key]=val
print my_dict
对于命令行:
python program.py key1:val1 key2:val2 key3:val3
输出:
my_dict = {'key3': 'val3', 'key2': 'val2', 'key1': 'val1'}
Note: args will be in string, so you will have to convert them to store numeric values.
希望对您有所帮助。
至于像 argparse, docopt and click 这样的当前库,其中 none 支持使用 dict
args。我能想到的最好的解决方案是自定义 argparse.Action
自己支持它:
import argparse
class MyAction(argparse.Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
super(MyAction, self).__init__(option_strings, dest, nargs, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
print '%r %r %r' % (namespace, values, option_string)
value_dict = {}
values.reverse()
while len(values) > 0:
v = eval(values.pop()).lstrip('--') # This is like crazy hack, I know.
k = eval(values.pop())
value_dict[k] = v
setattr(namespace, self.dest, value_dict)
parser = argparse.ArgumentParser()
parser.add_argument('-d', action=MyAction, nargs='*')
args = parser.parse_args('-d "--key" "key1" "--value" "val1" "--key" "key2" "--value" "val2"'.split())
print(args)
我会使用这样的东西:
p = argparse.ArgumentParser()
p.add_argument("--keyvalue", action='append',
type=lambda kv: kv.split("="), dest='keyvalues')
args = p.parse_args("--keyvalue foo=6 --keyvalue bar=baz".split())
d = dict(args.keyvalues)
您可以创建自定义操作,将 "append" 已解析的键值对直接放入字典,而不是简单地累积 (key, value)
元组列表。 (我看到的是 skyline75489 所做的;我的回答不同之处在于使用带有自定义类型的单个 --keyvalue
选项而不是单独的 --key
和 --value
选项来指定对。)
一种直接解析输入的方法,例如:
program.py --dict d --key key1 --value val1 --key key2 --value val2
是:
parser=argparse.ArgumentParser()
parser.add_argument('--dict')
parser.add_argument('--key', action='append')
parser.add_argument('--value', action='append')
args = parser.parse_args()
应该产生(如果我的心理分析器是正确的)
args = Namespace(dict='d', key=['key1','key2'], value=['value1','value2'])
你应该能够从中构造一个字典:
adict = {k:v for k, v in zip(args.key, args.value)}
使用 args.dict
将其分配给具有该名称的变量需要一些非 python 技巧。最好的办法是在另一个字典中用这个名字创建一个元素。
another_dict = {args.dict: adict}
此解决方案不会执行太多错误检查。例如,它不能确保键和值的数量相同。它还不会让您创建多个词典(即重复 --dict
参数)。它不需要任何特殊订单。 --dict
可能出现在 --key key1
对之后。几个 --value
参数可以放在一起。
将 key=value
与 chepner
捆绑在一起确实解决了一些问题。
这里是另一个使用自定义操作的解决方案,如果你想一起指定字典键对comma-separated --
import argparse
import sys
parser = argparse.ArgumentParser(description='parse key pairs into a dictionary')
class StoreDictKeyPair(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
my_dict = {}
for kv in values.split(","):
k,v = kv.split("=")
my_dict[k] = v
setattr(namespace, self.dest, my_dict)
parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, metavar="KEY1=VAL1,KEY2=VAL2...")
args = parser.parse_args(sys.argv[1:])
print args
运行:
python parse_kv.py --key_pairs 1=2,a=bbb,c=4 --key_pairs test=7,foo=bar
输出:
Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})
如果您想在字符串中使用 nargs 而不是 comma-separated 值:
class StoreDictKeyPair(argparse.Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
self._nargs = nargs
super(StoreDictKeyPair, self).__init__(option_strings, dest, nargs=nargs, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
my_dict = {}
print "values: {}".format(values)
for kv in values:
k,v = kv.split("=")
my_dict[k] = v
setattr(namespace, self.dest, my_dict)
parser.add_argument("--key_pairs", dest="my_dict", action=StoreDictKeyPair, nargs="+", metavar="KEY=VAL")
args = parser.parse_args(sys.argv[1:])
print args
运行
python arg_test4.py --key_pairs 1=2 a=bbb c=4 test=7 foo=bar
输出:
values: ['1=2', 'a=bbb', 'c=4', 'test=7', 'foo=bar']
Namespace(my_dict={'1': '2', 'a': 'bbb', 'c': '4', 'test': '7', 'foo': 'bar'})
Python 一行 argparse 字典参数 argparse_dictionary.py
# $ python argparse_dictionary.py --arg_dict=1=11,2=22;3=33 --arg_dict=a=,b,c=cc,=dd,=ee=,
# Namespace(arg_dict={'1': '11', '2': '22', '3': '33', 'a': '', 'c': 'cc', '': 'dd'})
import argparse
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument(
'--arg_dict',
action=type(
'', (argparse.Action, ),
dict(__call__=lambda self, parser, namespace, values, option_string: getattr(
namespace, self.dest).update(
dict([
v.split('=') for v in values.replace(';', ',').split(',')
if len(v.split('=')) == 2
])))),
default={},
metavar='KEY1=VAL1,KEY2=VAL2;KEY3=VAL3...',
)
print(arg_parser.parse_args())
另一种简单的方法:
parser = argparse.ArgumentParser()
parser.add_argument('--key1')
parser.add_argument('--key2')
args = parser.parse_args()
my_dict = args.__dict__
如果您只是想将 argparse 输入转换为字典,Python 3.6 中有一个简单的解决方案。举例如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input', help='the path to the input file')
parser.add_argument('-o', '--output', help='the path to the output file')
args = parser.parse_args()
arguments = dict(args._get_kwargs())
for k, v in arguments.items():
print(k, v)
给定命令行输入,例如 python3 script_name.py --input 'input.txt' --output 'output.txt'
,代码将输出到终端:
input input.txt
output output.txt
使用变量
d = vars(parser.parse_args())