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

2024-04-18 05:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个功能:

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))  

但我有个语法错误。
我知道我可以只传递参数值本身,但是对于具有许多参数的函数,我不希望最终用户为不需要的参数输入0s:

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

有办法做到这一点吗?你知道吗


Tags: 文件函数字符串py功能参数foodef
3条回答

如果你不关心安全,你可以这样做

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

或者这个:

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

但是,如果您关心的是用户的易用性,那么也许您应该看看argparse。你知道吗

使用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

我宁愿用正确的方法来做这件事并使用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()

相关问题 更多 >