0
import sys

def fun( a=7, b=1 ):
    print a, b

fun()
fun( a=5 )
fun( sys.argv[1:] )

第一个 fun() 打印出 '7,1',第二个打印出 '5,1',但第三个打印出 '['a=8', 'b=6'] 1]'。我希望能够调用我的程序

python my_program.py a=5 b=6

更改打印的 a 和 b 的值。但这不起作用,因为 sys.argv[1] 是一个字符串列表。

有没有办法将字符串列表转换为函数可以理解的形式?

4

2 回答 2

4

用于**kwarg 拆包:

d = {}
for a in sys.argv[1:]:
    k, v = a.split('=')
    d[k] = int(v)
func(**d)

另一种方式,使用csv模块:

import csv
func(**{k: int(v) for k, v in csv.reader(sys.argv[1:], delimiter='=')})

正如@MartijnPieters 所说,您可以使用该argparse模块

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-a', type=int)
parser.add_argument('-b', type=int)

args = parser.parse_args()
fun(**dict(args._get_kwargs()))

但是你必须调整输入参数的方式

于 2013-05-10T10:42:47.627 回答
4

用于*将列表解包为参数:

fun(*sys.argv[1:])

请注意,这将导致字符串参数;sys.argv命令行条目始终是字符串。

您可能希望查看该argparse模块来为您处理命令行参数,包括自动转换:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-a', type=int, default=7)
parser.add_argument('-b', type=int, default=1)
args = parser.parse_args()

func(args.a, args.b)

然后使用:

$ python my_program.py -a=5 -b=6

这里的额外优势是您可以获得适当的帮助反馈,并且您遵循标准的命令行约定:

$ python my_program.py --help
usage: [-h] [-a A] [-b B]

Process some integers.

optional arguments:
  -h, --help  show this help message and exit
  -a A
  -b B
于 2013-05-10T10:42:52.110 回答