如何通过执行作为字符串输入的指令将值传递给 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
我有一个函数:
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