如何通过执行作为字符串输入的指令将值传递给 python 函数?

How to pass values to python function by executing instructions input as string?

我有一个函数:

def foo(a=0, b=0, c=0, val=0, someotherval=0):  
    print val + someotherval  

此函数在文件中调用 bar.py。当我从控制台 运行 bar.py 时,我想将参数作为字符串传递给函数:

>>python bar.py "val=3"  

所以函数 foo 将其解释为:

foo(val=3)  

我试图使用 exec 命令。在我的 bar.py 文件中:

import sys
cmdlinearg = sys.argv[1]    # capturing commandline argument
foo(exec(cmdlinearg))  

但是我得到一个语法错误。
我知道我可以自己传递参数值,但是对于一个有很多参数的函数,我不希望最终用户为不需要的参数输入 0:

>>python bar.py "0" "0" "0" "3"  

有办法做到这一点吗?

如果您知道其他参数永远不会输入,您可以只使用默认值。

foo(0,0,exec(cmdlinearg),0)

如果不担心安全,可以

exec('foo(%s)' % sys.argv[1])

或者这样:

def getdict(**vals):
    return vals
kwargs = exec('getdict(%s)' % sys.argv[1])
foo(**kwargs)

但是,如果您关心的是用户的易用性,也许您应该看看 argparse

我宁愿以正确的方式使用 argparse。

您的命令行界面如下所示:

bar.py --a 0 --b 0 --c 0 --val 0 --someotherval 0

还有代码:

import argparse

def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('a', type=int, default=0)
  ...
  args = parser.parse_args()
  foo(a=args.a, b=args.b, c=args.c, var=args.val, someotherval=args.someotherval)

if __name__ == '__main__':
  main()

如何使用 argparse 来解析命令行参数?

例子-

import argparse

def foo(a=0, b=0, c=0, val=0, someotherval=0):  
    print(val + someotherval)

parser = argparse.ArgumentParser(description='Some Parser')
parser.add_argument('-a','--a',default=0,type=int,help="value for a")
parser.add_argument('-b','--b',default=0,type=int,help="value for a")
parser.add_argument('-c','--c',default=0,type=int,help="value for a")
parser.add_argument('-v','--val',default=0,type=int,help="value for a")
parser.add_argument('-s','--someotherval',default=0,type=int,help="value for a")
args = parser.parse_args()
foo(a=args.a,b=args.b,c=args.c,val=args.val,someotherval=args.someotherval)

然后您可以调用并获得类似 -

的结果
>python a.py
0

>python a.py --val 10
10

>python a.py --val 10 --someotherval 100
110

看看这个图书馆: http://click.pocoo.org

它可能对您有用。

import click

@click.command()
@click.option('-a', default=0)
@click.option('-b', default=0)
@click.option('-c', default=0)
@click.option('--val', default=0)
@click.option('--someotherval', default=0)
def foo(a, b, c, val, someotherval):  
    print val + someotherval

if __name__ == '__main__':
    foo()

但是,您必须添加使用选项作为参数,而不是字符串:

>> python bar.py --val=3